• 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

  • 相关阅读:
    android笔记:ListView及ArrayAdapter
    android示例:一个简单的登陆程序
    Android笔记:RelativeLayout
    Android笔记:ContextMenu
    java swing示例
    java多线程与并发笔记
    java常用代码
    java学习笔记整理
    Android笔记:intent
    Android笔记:Button
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4996488.html
Copyright © 2020-2023  润新知