Posted onEdited onInLeetCodeDisqus: Symbols count in article: 1.3kReading time ≈1 mins.
O(n) time 因为没有括号,所以不需要递归 整体思路是用加减把算式分隔开,把连续的乘除集中处理,op表示前一步运算,c表示当前处理的运算,每次不管c是加减乘除哪种运算都用local来跟num进行op的运算并把局部结果保存在local里,如果c是乘除则local继续处理运算(连续的乘除运算),如果c是加减则可以进行分割,把当前的局部结果累加到global里
classSolution { public: intcalculate(string s){ long global = 0, local = 0, num = 0; char op = '+'; s += '+'; for (char c : s) { if (isdigit(c)) { num = num * 10 + c - '0'; } elseif (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; } };