其他分享
首页 > 其他分享> > 【LeetCode】227. 基本计算器 II(同NC137)

【LeetCode】227. 基本计算器 II(同NC137)

作者:互联网

一、题目

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

二、解决

1、栈

思路:

栈的进出主要看运算符的优先级,遇到连续正常数字就乘10加数,遇到“+ or -”符号就入栈,遇到"* or /"就进行计算。最后再出栈算总和。

代码:

class Solution {
    public int calculate(String s) {
        if (s == null || s.length() == 0) return 0;
        Stack<Integer> stack = new Stack<>();
        s += '+';
        char op = '+';
        for (int i = 0, n = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') { n = n * 10 + c - '0'; continue; }
            if (c == ' ') continue;
            if (op == '+') stack.push(n);
            else if (op == '-') stack.push(-n);
            else if (op == '*') stack.push(stack.pop()*n);
            else if (op == '/') stack.push(stack.pop()/n);
            op = c;
            n = 0;
        }

        int total = 0;
        while (!stack.isEmpty()) total += stack.pop();
        return total;
    }
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

2、迭代求和

思路:

pre记录之前加总和,curr记录当下遍历位置的数,最后返回两者加总即可。

代码:

class Solution {
    public int calculate(String s) {
        int pre = 0, curr = 0, sign = 1, op = 0, num = 0;
        
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                num = num * 10 + (s.charAt(i) - '0');
                if (i == s.length() - 1 || !Character.isDigit(s.charAt(i + 1))) {
                    curr = (op == 0 ? num : (op == 1 ? curr * num : curr / num));
                }
                
            } else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
                op = (s.charAt(i) == '*' ? 1 : -1);
                num = 0;
                
            } else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
                pre += sign * curr;
                sign = (s.charAt(i) == '+' ? 1 : -1);
                op = 0;
                num = 0;
            }
        }
        
        return pre + sign * curr;
    }
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

补充:
1、Character.isDigit(c):判断字符c是否为数字。
   if yes, return true; 
   else return false

三、参考

1、Share my java solution
2、Java straight forward iteration Solution with comments, No Stack, O(N) & O(1)
3、Explanation for Java O(n) time & O(1) space solution
4、【宫水三叶】使用「双栈」解决「究极表达式计算」问题

标签:curr,charAt,int,II,num,NC137,227,return,op
来源: https://blog.csdn.net/HeavenDan/article/details/117219220