Leetcode 772. Basic Calculator III

[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

 

转载于:https://www.cnblogs.com/uicoder/p/10468689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值