码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 772. Basic Calculator III

时间:2019-03-04 09:55:38      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:The   iii   pos   rev   rand   function   否则   .com   val   

 

 

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

标签:The   iii   pos   rev   rand   function   否则   .com   val   

原文地址:https://www.cnblogs.com/uicoder/p/10468689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!