题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;

/**
搬照大佬代码
运算时,可以将括号内的数据看成一个整体 → 采用递归的方式解决问题
递归:子问题 和 整体问题是一样的,所以最初的运算符外也需要加一个()
 */
public class Main{
    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        
        //为方便处理,将字符串中的中括号,大括号都换为小括号
        s = s.replace('[','(');
        s = s.replace(']',')');
        s = s.replace('{','(');
        s = s.replace('}',')');

        //递归 - 统一计算逻辑, 最大的表达式外也加上括号
        if(s.charAt(0) != '('){
            s = '(' + s + ')';
        }

        System.out.println(solve(s));

        in.close();

    }

    //递归求表达式的值
    private static int solve(String s){
        char[] arr = s.toCharArray();
        //数组长度,使用len表示,以便方便取用
        int len = arr.length;

        //用于存放数字
        Stack<Integer> stack = new Stack<>();

        //记录数字
        int number = 0;
        
        //记录数字number的上一个运算符 // 默认为 + , 为+的时候就能包括住operator之前的数字不存在的情况
        char operator = '+';

        for(int i = 0; i < len; i++){
            char c = arr[i];
            
            //遇到左括号,找到与这个左括号响应的右括号的位置
            //即左右括号数量相等时(计算:count记录括号数量, 遇到左括号就加1,遇到右括号就-1)
            //递归计算括号内的表达式
            if(c == '('){
                int j = i + 1;
                int count = 1;
                while(count > 0){
                    if(arr[j] == '('){
                        count++;
                    }

                    if(arr[j] == ')'){
                        count--;
                    }

                    j++;
                }
                //递归 获取 括号内表达式的值
                number = solve(s.substring(i + 1, j - 1)); //注意j - 1位置是')'字符
                i = j - 1; //防止arr[j]为空指针即j超过范围 + for循环中有i++,如果i = j, 那么就会超范围或者漏掉j位置的符号
            }else if(Character.isDigit(c)){
                //求多位数字如 12
                number = number * 10 + c - '0';
            }

            if(!Character.isDigit(c) || i == len - 1){
                if(operator == '+'){
                    stack.push(number); //先放进去,最后再加
                }else if(operator == '-'){
                    stack.push(-1 * number); //最后加的时候减去
                }else if(operator == '*'){
                    stack.push(stack.pop() * number);
                }else if (operator == '/') {
					stack.push(stack.pop() / number);
				}
                
                //更新符号
                operator = c;
                //刷新数字
                number = 0;
            }

        }

        //栈中数字求和
        int sum = 0;
        while(!stack.isEmpty()){
            sum += stack.pop();
        }
        return sum;

    }
}

全部评论

相关推荐

头像
2024-12-19 18:11
英特尔_Software_engineer
下水道鼠鼠鼠鼠:男的能去当技师吗 好进吗
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司9个岗位
点赞 评论 收藏
分享
到我怀里来:教育背景不用写主修课程,还有你写班级排名是什么意思?咋不写寝室排名呢😂要写就写年纪排名。得了那么多奖结果项目经历什么技术细节都不写清楚,把技术细节写清楚,用了什么技术解决了什么问题,“用了python语言、用了SQL语言”,有这样写的?hr一看就知道你是包装的或者比赛的奖是混的,你什么技术细节都不懂。校内职务全删了,什么三好学生、文明寝室这些你写上去干嘛?重复的奖学金你写三次干嘛?自我评价写那么多干嘛?谁想看这些
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务