Leetcode 772. Basic Calculator III

Posted uicoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 772. Basic 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.

 

My Python Solution by referring to Grandyang‘s post: https://www.cnblogs.com/grandyang/p/8873471.html

 1 class Solution:
 2     def getRes(self, resSoFar, sign, num):
 3         if sign == +:
 4             return resSoFar + num
 5         elif sign == -:
 6             return resSoFar - num
 7         elif sign == *:
 8             return resSoFar * num
 9         elif sign == /:
10             return int(resSoFar / num)
11             
12     def calculate(self, s: str) -> int:
13         sign = + # store the previous sign
14         num = 0 # store current num passed
15         resCur = 0 # store current res from "*/" operations
16         res = 0 # store the global result
17         n = len(s)
18         i = 0
19         while i < n:
20             ch = s[i]
21             if ch.isdigit(): # get current number
22                 num = num*10 + int(ch)
23             elif ch == (: # start the left parenthesis
24                 cnt = 1
25                 j = i + 1
26                 while j < n:
27                     if s[j] == (:
28                         cnt += 1
29                     elif s[j] == ):
30                         cnt -= 1
31                     if cnt == 0: # closing right parenthesis just passed
32                         num = self.calculate(s[i+1:j]) # update num or resCur?
33                         break # 这个break不能忘了!
34                     j += 1
35                 i = j 
36             # 下面这个Trick(用if而不是用elif) 非常重要,否则 i==n-1 下不来!
37             if ch in "+-*/" or i == n - 1: # Take action - process previous number and sign               
38                 resCur = self.getRes(resCur, sign, num) # get current result by combining resCur and num # -4, -2       
39                 if ch in "+-" or i == n - 1: # collapse the local w/ the global result iff it‘s "+-" and i==n-1
40                     res += resCur # 6 - 4
41                     resCur = 0
42                 sign = ch
43                 num = 0
44             i += 1
45                 
46         return res

 

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

Leetcode solution 772: Basic Calculator III

LeetCode227:Basic Calculator II

LeetCode:Basic Calculator

LeetCode-Basic Calculator

[LeetCode]224. Basic Calculator(模拟,栈)

Leetcode 224: Basic Calculator