227. Basic Calculator II

题目:

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

链接: http://leetcode.com/problems/basic-calculator-ii/

题解:

比较简练的方法就是把String根据运算符先split一下,之后再计算各部分,另外也可以用Token来做。自己做的方法比较繁琐,就是从头到尾遍历String,然后根据运算符的不同做一些特殊的处理。这里几个小地方,比如一开始 s += '+'来处理最后的元素,保存之前的运算符,之前运算的结果等等。二刷的时候一定要好好优化。

Time Complexity - O(n), Space Complexity - O(1)

public class Solution {
    public int calculate(String s) {
        if(s == null || s.length() == 0)
            return 0;
        s += '+';    
        char prevOperator = '+';
        int res = 0, prevNum = 0, curNum = 0;
        
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == ' ')
                continue;
            else if (Character.isDigit(c))
                curNum = curNum * 10 + (int)(c - '0');
            else if (c == '+' || c == '-') {
                if(prevOperator == '+' || prevOperator == '-') {
                    if(prevOperator == '+') {
                        res += prevNum + curNum;
                    } else {
                        res += prevNum - curNum;
                    }
                } else {
                    if(prevOperator == '*')
                        res += prevNum * curNum;
                    else
                        res += prevNum / curNum;
                }
                curNum = 0;
                prevNum = 0;
                prevOperator = c;
            } else if (c == '*' || c == '/') {
                if(prevOperator == '+')
                    prevNum = curNum;
                else if(prevOperator == '-')
                    prevNum = -curNum;  
                else if(prevOperator == '*')
                    prevNum *= curNum;
                else if(prevOperator == '/')
                    prevNum /= curNum;
                    
                curNum = 0;
                prevOperator = c;
            }
        }
            
        
        return res;
    }
}

Reference:

https://leetcode.com/discuss/41790/10-16-lines-java-easy

https://leetcode.com/discuss/41558/20ms-o-n-time-o-1-space-one-scan-c-solution

https://leetcode.com/discuss/41641/17-lines-c-easy-20-ms

https://leetcode.com/discuss/41902/share-my-java-solution

https://leetcode.com/discuss/42903/java-straight-forward-iteration-solution-with-comments-stack

https://leetcode.com/discuss/42423/28ms-code-with-stacks-for-oprand-extension-cover-also-given

原文地址:https://www.cnblogs.com/yrbbest/p/4996488.html