224 基本計算器

2021-10-21 23:50:09 字數 2034 閱讀 3578

整個式子只有+ - ( ),如果我們把括號展開,那麼可以遍歷一次得到答案,即數字和符號的組合相加

例如1+2+(3-(4+5)) = 1+2+3-4-5,是+1 +2 +3 -4 -5這些數字合起來

關鍵是我們怎麼把括號展開同時給每個數字賦予正確的符號

數字的符號被兩個因素影響

數字當前的符號

數字之前的符號

例如-(1+2)中2的符號,第一點,2的符號是+,第二點,2的符號受到了括號前-的影響,綜合下來2的符號是-

數字當前的符號很好判斷,要麼是正要麼是負,但是數字之前的符號需要記錄下來,每個括號成對出現,所以我們可以用棧來表示,遇到左括號時,當前符號入棧,遇到右括號時,棧頂符號彈出

經過以上分析,我們需要兩個變數

sign =

1ops =[1

]

sign初始化為1,ops初始化為[1],這是因為我們為了方便處理-開頭的表示式,相當於在表示式前加上0,變為以+開頭

ret =

0 n =

len(s)

i =0while i < n:

if s[i]

==' '

: i +=

1elif s[i]

=='+'

:# +

pass

elif s[i]

=='-'

:# -

pass

elif s[i]

=='('

:# 左括號

pass

elif s[i]

==')'

:# 右括號

pass

else

:# 碰到數字

pass

按照之前的分析,我們獲取數字,然後統計結果ret += sign*num即可

上面的**完善後變為

class

solution

:def

calculate

(self, s:

str)

->

int:

ops =[1

] sign =

1 ret =

0 n =

len(s)

i =0while i < n:

if s[i]

==' '

: i +=

1elif s[i]

=='+'

:# +號繼承之前的符號

sign = ops[-1

] i +=

1elif s[i]

=='-'

:# -號反轉

sign =

-ops[-1

] i +=

1elif s[i]

=='('

: i +=

1elif s[i]

==')'

: ops.pop(

) i +=

1else

: num =

0while i.isdigit():

num = num*10+

ord(s[i])-

ord(

'0')

i+=1 ret += num*sign

return ret

把合格的中綴表示式轉換成字尾表示式,這類題都能這麼解

150. 逆波蘭表示式求值 是檢驗逆波蘭表示式求值是否正確的題目

224 基本計算器

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式可以包含左括號 右括號 加號 減號 非負整數和空格 示例 1 輸入 1 1 輸出 2 示例 2 輸入 2 1 2 輸出 3 示例 3 輸入 1 4 5 2 3 6 8 輸出 23 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的...

224 基本計算器

題目描述 實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式可以包含左括號 右括號 加號 減號 非負整數和空格 示例 1 輸入 1 1 輸出 2 示例 2 輸入 2 1 2 輸出 3 示例 3 輸入 1 4 5 2 3 6 8 輸出 23 說明 你可以假設所給定的表示式都是有效的。請不要...

224 基本計算器

leetcode題目 224.基本計算器 剛開始審題不認真,想用以前本科時期學習時用的棧 逆波蘭表示式。其實注意到了上面的幾個注意點就好寫了。解釋上述三點 定義兩個棧 因為棧是先進後出,因此需要倒序遍歷s。假設當前遍歷到s的pos位置,分為如下幾種情況 遇到數字0 9,將數字 不一定是個位數 獲取,...