题解 | #牛牛计算器#
牛牛计算器
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处理了,所以要加上对于两位数字的处理