227. [栈]基本计算器 II
227. 基本计算器 II
核心要点:优先计算*,/运算,将操作化简到只剩+,-。
- 用
continue跳过空格,当然也可以用String.replace(" ","")做一个预处理; - 由于是使用循环逐位读取,要注意保证数字完整,然后再根据运算符决定入栈;
- 如果是加号
'+',说明前面的运算独立于以后的运算,可以将结果暂时放入栈; - 如果是减号
'-',可以看成-1 * tempNum,然后将-tempNum入栈; - 如果是乘号
'*'或者除号'/',由于前面的运算独立于此,可以先计算lastNum和tempNum积,然后结果入栈。
// 执行用时: 11 ms , 在所有 Java 提交中击败了 87.54% 的用户
// 内存消耗: 38.7 MB , 在所有 Java 提交中击败了 97.26% 的用户
class Solution {
public int calculate(String s) {
Stack<Integer> numStack = new Stack<>();
char lastOp = '+';
char[] arr = s.toCharArray();
for(int i = 0; i < arr.length; i ++){
if(arr[i] == ' ') continue;
if(Character.isDigit(arr[i])){
int tempNum = arr[i] - '0';
while(++i < arr.length && Character.isDigit(arr[i])){
tempNum = tempNum * 10 + (arr[i] - '0');
} i--;
if(lastOp == '+') numStack.push(tempNum);
else if(lastOp == '-') numStack.push(-tempNum);
else numStack.push(res(lastOp, numStack.pop(), tempNum));
} else lastOp = arr[i];
}
int ans = 0;
for(int num : numStack) ans += num;
return ans;
}
private int res(char op, int a, int b){
if(op == '*') return a * b;
else if(op == '/') return a / b;
else if(op == '+') return a + b; //其实加减运算可以忽略
else return a - b;
}
}

浙公网安备 33010602011771号