LeetCode——227. 基本计算器 II(Basic Calculator II)[中等]——分析及代码(Java)

LeetCode——227. 基本计算器 II[Basic Calculator II][中等]——分析及代码[Java]

一、题目

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 2^31 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 栈

(1)思路

设计 2 个栈分别存储数字和符号,因为乘除运算优先级较高,在遍历过程中直接进行乘除运算并将结果作为一个新的数放入栈中。最后进行加减运算,得到待求解。

(2)代码

class Solution {
    
    
    public int calculate(String s) {
    
    
        char[] c = s.toCharArray();
        int n = c.length;
        Stack<Integer> nums = new Stack<>();//存储数字
        Stack<Character> signs = new Stack<>();//存储符号
        for (int i = 0; i < n; i++) {
    
    
            if (c[i] == '+' || c[i] == '-' || c[i] == '*' || c[i] == '/')//处理符号
                signs.add(c[i]);
            else if (c[i] >= '0' && c[i] <= '9') {
    
    
                int num = (int)c[i] - '0';
                while (i + 1 < n && c[i + 1] >= '0' && c[i + 1] <= '9')//处理数字
                    num = num * 10 + (int)(c[++i] - '0');
                nums.add(num);
                if (!signs.empty() && (signs.peek() == '*' || signs.peek() == '/')) {
    
    //遇到乘除法,先进行计算
                    char sign = signs.pop();
                    int num2 = nums.pop(), num1 = nums.pop();
                    if (sign == '*')
                        nums.add(num1 * num2);
                    else
                        nums.add(num1 / num2);
                }
            }
        }
        int ans = 0;
        while (!nums.empty()) {
    
    //计算所有加减法
            char sign = (signs.empty()) ? '+' : signs.pop();
            ans = (sign == '+') ? ans + nums.pop() : ans - nums.pop();
        }
        return ans;
    }
}

(3)结果

执行用时 :25 ms,在所有 Java 提交中击败了 22.60% 的用户;
内存消耗 :40.8 MB,在所有 Java 提交中击败了 34.43% 的用户。

2. 栈(优化)

(1)思路

在上述思路中,最后运算只涉及加减法,因此可直接在遍历过程中计算乘除法,并将减数作为负数压入数字栈,从而省去符号栈。

(2)代码

class Solution {
    
    
    public int calculate(String s) {
    
    
        char[] c = s.toCharArray();
        int n = c.length, ans = 0;
        char sign = '+';
        Stack<Integer> nums = new Stack<>();//存储数字
        for (int i = 0; i < n; i++) {
    
    
            if (c[i] == '+' || c[i] == '-' || c[i] == '*' || c[i] == '/')//记录当前符号
                sign = c[i];
            else if (c[i] >= '0' && c[i] <= '9') {
    
    
                int num = (int)c[i] - '0';
                while (i + 1 < n && c[i + 1] >= '0' && c[i + 1] <= '9')//处理数字
                    num = num * 10 + (int)(c[++i] - '0');
                switch (sign) {
    
    
                    case '+':
                        nums.push(num);
                        break;
                    case '-':
                        nums.push(-num);
                        break;
                    case '*':
                        nums.push(nums.pop() * num);
                        break;
                    case '/':
                        nums.push(nums.pop() / num);
                        break;
                }
            }
        }
        while (!nums.empty())//计算所有加减法
            ans += nums.pop();
        return ans;
    }
}

(3)结果

执行用时 :9 ms,在所有 Java 提交中击败了 91.90% 的用户;
内存消耗 :38.6 MB,在所有 Java 提交中击败了 66.36% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/114671621
今日推荐