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