0%

227. Basic Calculator II

O(n) time
因为没有括号,所以不需要递归
整体思路是用加减把算式分隔开,把连续的乘除集中处理,op表示前一步运算,c表示当前处理的运算,每次不管c是加减乘除哪种运算都用local来跟num进行op的运算并把局部结果保存在local里,如果c是乘除则local继续处理运算(连续的乘除运算),如果c是加减则可以进行分割,把当前的局部结果累加到global里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
int calculate(string s) {
long global = 0, local = 0, num = 0;
char op = '+';
s += '+';
for (char c : s) {
if (isdigit(c)) {
num = num * 10 + c - '0';
} else if (c != ' ') {
switch (op) {
case '+': local += num; break;
case '-': local -= num; break;
case '*': local *= num; break;
case '/': local /= num; break;
}
if (c == '+' || c == '-') {
global += local;
local = 0; // local归零并不会影响后边的计算,因为当前的c是加减,所以下一步运算一定是0+/-num并得到一个新的local,如果c是乘除则不修改local,因为下一步运算是乘除,local被用了要清零
}
op = c;
num = 0; // num被用了要清零
}
}
return global;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int calculate(string s) {
int res = 0, opnd = 0;
istringstream input('+' + s + '+'); // 开头结尾都要加+来触发输入和累加更新res
char op;
while (input >> op) {
if (op == '+' || op == '-') {
res += opnd;
if (input >> opnd) {
opnd *= (44 - op); // +的ASCII码是43,-的ASCII码是45
}
} else {
int opnd2;
input >> opnd2;
if (op == '*') {
opnd *= opnd2;
} else {
opnd /= opnd2;
}
}
}
return res;
}
};