整個式子只有+ - ( ),如果我們把括號展開,那麼可以遍歷一次得到答案,即數字和符號的組合相加
例如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,將數字 不一定是個位數 獲取,...