leetcodeBasic Calculator III

Posted seyjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcodeBasic Calculator III相关的知识,希望对你有一定的参考价值。

题目如下:

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

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

You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647].

Some examples:

"1 + 1" = 2
" 6-4 / 2 " = 4
"2*(5+5*2)/3+(6/2+8)" = 21
"(2+6* 3+5- (3*14/7+2)*5)+3"=-12
 

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

 

解题思路:算法上没有什么技术难度,无非就是要考虑各种情况。我的方法是用两个栈分别保存运算符号和非运算符号(包括数字和括号)。遇到右括号后,往前找左括号,遇到乘号或者除号,直接计算出结果。

代码如下:(写的很乱,也没心情优化了)

class Solution(object):
    operator = []
    num = []
    def calcMandD(self,v):
        if len(self.operator) == 0 or len(self.num) == 0:
            return False 
        if (self.operator[-1] == * or self.operator[-1] == /) and (self.num[-1] != ( and self.num[-1] != )):
            if self.operator[-1] == * :
                tmp = int(self.num[-1]) * int(v)
                self.num[-1] = str(tmp)
            else:
                tmp = int(self.num[-1]) / int(v)
                self.num[-1] = str(tmp)
            del self.operator[-1]
            return True
        return False
    def calcParentheses(self):
        t1 = self.num[-1]
        del self.num[-1]
        
        tn = []
        to = []
        
        tn.append(t1)
        
        while self.num[-1] != (:
            t2 = self.num[-1]
            
            to.insert(0, self.operator[-1])
            tn.insert(0, t2)
            del self.operator[-1]
            del self.num[-1]
        del self.num[-1] #del (
        
        
        t1 = tn[0]
        del tn[0]
        while len(tn) > 0:
            t2 = tn[0]
            if to[0] == +:
                t1 = int(t1) + int(t2)
            elif to[0] == -:
                t1 = int(t1) - int(t2)
            del to[0]
            del tn[0]        
        return str(t1)
        #self.num.append(str(t1))
    def calcAandM(self):
        t1 = self.num[0]
        del self.num[0]
        while len(self.num) > 0:
            t2 = self.num[0]
            if self.operator[0] == +:
                t1 = int(t1) + int(t2)
            elif self.operator[0] == -:
                t1 = int(t1) - int(t2)
            del self.operator[0]
            del self.num[0]
        return int(t1)        
        
    def calculate2(self, s): 
        n = ‘‘
        for i in s:
            if i ==  :
                continue
            if i == + or i == - or i == * or i == /:
                if n != ‘‘:
                    if self.calcMandD(n) == False:
                        self.num.append(n)
                n = ‘‘
                self.operator.append(i)
                continue
            if i == (:
                if n != ‘‘:
                    self.num.append(n)
                n = ‘‘
                self.num.append(i)
                continue
            if i == ):
                if n != ‘‘:
                    if self.calcMandD(n) == False:
                        self.num.append(n)
                n = ‘‘
                ret = self.calcParentheses()
                while len(self.operator) >0 and (self.operator[-1] == * or self.operator[-1] == /) and (self.num[-1] != ( and self.num[-1] != )):
                    if self.operator[-1] == *:
                        #print self.num
                        #print self.operator
                        ret = int(self.num[-1]) * int(ret)
                    else:
                        ret = int(self.num[-1])/int(ret)
                    del self.operator[-1] 
                    del self.num[-1]
                self.num.append(ret)
                    
                
                continue
            if i>=0 and i <= 9:
                n += i
        if n!=‘‘:
            if self.calcMandD(n) == False:
                self.num.append(n)
                  
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        self.operator = []
        self.num = []
        self.calculate2(s)
        #print (self.operator)
        #print (self.num)
        return self.calcAandM()

 

以上是关于leetcodeBasic Calculator III的主要内容,如果未能解决你的问题,请参考以下文章

leetcodeBasic Calculator III

Arcgis中用raster calculator怎样 计算山的顶点,应怎样编写

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:Calculator.main 中的 0(Calculator.java:25)[重复]

typescript 开发人员日记:第1天 - packages / server / src / calculator / calculator.ts

S308 Calculator技术难点

224. Basic Calculator