题解 | #牛牛计算器#

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace

import java.util.Stack;

public class Solution {

     public static int calculate(String s) {
        Stack<Integer> nums = new Stack<>(); // 存储操作数的栈

        int num = 0;
        char preOp = '+';
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            // 如果当前字符是数字
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0'); // 将字符转换为数字

                // 处理连续的数字
                while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){
                    num = num * 10 + (s.charAt(i + 1) - '0');
                    i++;
                }
            } else if (c == '(') {
                // 如果是左括号
                int j = i, cnt = 0;
                for (; i < s.length(); ++i) {
                    // 统计括号
                    if (s.charAt(i) == '(') cnt++;
                    if (s.charAt(i) == ')') cnt--;
                    if (cnt == 0) {
                        break; // 当左括号和右括号个数相等时,认为匹配完成
                    }
                }
                num = calculate(s.substring(j + 1, i)); // 递归计算括号内部表达式的结果
            }
            // 如果当前字符不是空格或者是表达式的最后一个字符
            if (!Character.isWhitespace(c) || i == s.length() - 1) {
                if (preOp == '+') {
                    nums.push(num);
                } else if (preOp == '-') {
                    nums.push(-num); // -号,则入栈相反数
                } else if (preOp == '*') {
                    // 修正此处代码,将前一个数字和当前数字相乘并将结果入栈
                    nums.push(nums.pop() * num);
                }
                num = 0; // 重置当前操作数
                preOp = c; // 更新前一个操作符
            }
        }
        int res = 0;
        while (!nums.isEmpty()) {
            res += nums.pop(); // 将栈中剩余的操作数相加得到最终结果
        }
        return res;
     }
}

对于用例输入 "(((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)" 预期输出 4555 实际输出 4546

是因为字符串把数字10拆分成1和0处理了,所以要加上对于两位数字的处理

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务