Leetcode 224-基本计算器

先做Leetcode 227再做本题

本题在227的基础上多了括号

题解

关于括号的递归调用思想请参考labuladong

将 减法、乘法、除法 转换为 加法

某个数 num, 如果前面的对应的运算符是 -,那么 将 -num 压入栈中

这样,我们只需在最后将栈的元素全部弹出,完成加法操作,即可得到最终结果

对于括号,它存在递归性质

3 * (2 + 4 * 3) + 2

= 3 * calculate(2 + 4 * 3) + 2

= 3 * 24 + 2

即我们可以将括号内的字符串当作一个运算式,再递归调用本函数,最终返回一个数值

bash 复制代码
class Solution {
    int i=0;
    public int calculate(String s) {
        return calHelper(s);
    }

    public int calHelper(String s){
        //数字num是和已有的运算符sign做计算
        Stack<Integer> nums=new Stack<>();
        //Stack<Character> ops=new Stack<>();
        char[] str=s.toCharArray();
        //对于第一个数字,其之前的运算符视为加号
        char preSign = '+';
        //记录当前数字大小
        int num=0;

        for(;i<str.length;i++){
            char c=str[i];
            //1.是数字
            if(c>='0'&&c<='9'){
                num=num*10+(c-'0');
            }
            // 2、如果为左括号,从左括号的下一个字符开始递归
            else if(c == '(') { 
                i++;
                num = calHelper(s);
            }
            //3.是符号或者遍历到了字符串末尾
            if(!Character.isDigit(c) && s.charAt(i) != ' '||i == str.length-1){
                switch(preSign){
                    case '+':
                    nums.push(num);break;
                    case '-':
                    nums.push(-num);break;
                    case '*':
                    nums.push(nums.pop()*num);break;
                    case '/':
                    nums.push(nums.pop()/num);break;
                }
                // 更新符号为当前符号,数字清零
                preSign=c;
                num=0;
            }
            // 4、如果为右括号,结束递归(返回后,i指向新生成的数字)
            if(c == ')') {
                //i++; 
                break;
            }
        }
        // 将栈中所有结果求和就是答案
        int res = 0;
        while (!nums.isEmpty()) {
            res += nums.pop();
        }
        return res;
    }
}
相关推荐
IronMurphy3 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬4 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership4 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826524 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u5 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
wxy不爱写代码5 小时前
C++多线程
面试·职场和发展
野生技术架构师7 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
_深海凉_8 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
ja哇9 小时前
大厂面试高频八股
java·面试·职场和发展
踩坑记录9 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode