224. 基本計算器(困難)
答案整理 加深記憶 便於複習!
python eval()函式還沒完全看懂。。。
給你乙個字串表示式 s ,請你實現乙個基本計算器來計算並返回它的值。
示例 1:
輸入:s = 「1 + 1」示例 2:輸出:2
輸入:s = " 2-1 + 2 "示例 3:輸出:3
輸入:s = 「(1+(4+5+2)-3)+(6+8)」輸出:23
1 <= s.length <= 3 * 105由於字串除了數字與括號外,只有加號和減號兩種運算子。因此,如果展開表示式中所有的括號,則得到的新表示式中,數字本身不會發生變化,只是每個數字前面的符號會發生變化。s 由數字、』+』、』-』、』(』、』)』、和 』 』 組成
s 表示乙個有效的表示式
因此,我們考慮使用乙個取值為 的整數 sign 代表「當前」的符號。根據括號表示式的性質,它的取值:
考慮到第二點,我們需要維護乙個棧 ops,其中棧頂元素記錄了當前位置所處的每個括號所「共同形成」的符號。例如,對於字串 1+2+(3-(4+5)):
在得到棧 ops 之後, sign 的取值就能夠確定了:如果當前遇到了 + 號,則更新 sign ← ops.top();如果遇到了遇到了 − 號,則更新sign← - ops.top()。
然後,每當遇到 ( 時,都要將當前的 sign 取值壓入棧中;每當遇到 ) 時,都從棧中彈出乙個元素。這樣,我們能夠在掃瞄字串的時候,即時地更新 ops 中的元素。
c++:
class
solution
else
if(s[i]
=='-'
)else
if(s[i]
=='('
)//遇到左括號時就將左括號前乙個運算子(記為sign1)壓入棧內,
//接下來左括號後右括號前的資料都將受到該符號的影響,因為在此之後ops.top()返回的都是sign1,假設括號中間還有負號,負負得正,符合實際。
else
if(s[i]
==')'
)//一旦遇到該左括號對應的右括號,sign1就被彈出棧了,sign1的使命就結束了。
else
ret +
= sign*num;}}
return ret;}}
;
複雜度分析
時間複雜度:o(n),其中 n 為字串 s 的長度。需要遍歷字串 s 一次,計算表示式的值。
空間複雜度:o(n),其中 n 為字串 s 的長度。空間複雜度主要取決於棧的空間,棧中的元素數量不超過 n。
直接使用python eval()函式,報錯如下:
直接eval(s)的話會報memoryerror,考慮從內到外依次計算括號(目前還沒太理解明白,下次再看)
class
solution
: def calculate
(self, s: str)
->
int:
while true:
a=s.
rfind
('('
) b=s.
find
(')'
,a)if a==-1
:break
s=s[
:a]+
str(
eval
(s[a:b+1]
))+s[b+1:
]return
eval
(s)
網友的疑惑,正好也解答了我的疑問
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,將數字 不一定是個位數 獲取,...