224 基本計算器

2021-10-21 19:32:37 字數 2176 閱讀 2254

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,將數字 不一定是個位數 獲取,...