給你乙個字串表示式 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*
105s 由數字、'+'、'-'、'('、')'、和 ' ' 組成
s 表示乙個有效的表示式
總體思路:字串中一共包含6種字元:。在數學中,我們進行帶括號的加減運算有兩種方法:
先計算括號內,在計算括號外,從左往右依次計算
首先去掉所有的括號,且去括號後要變號,然後從左往右依次計算。
相比較而言,第二種方法更直接。我們選擇第二種方法來實現。
如果要展開表示式中所有的括號,則得到的新表示式中,數字本身不會發生變化,只是每個數字前面的符號會發生變化。
因此,我們考慮使用乙個取值為 的整數 sign 代表「當前」的符號。根據括號表示式的性質,它的取值:
考慮到第二點,我們需要維護乙個棧 stk,其中棧頂元素記錄了當前位置所處的每個括號所「共同形成」的符號。因此,數字加減的符號實際由兩部分決定:
數字本身前面的+、-符號。這一部分,通過判斷 『+』 後者 『-』 ,可直接給sign取正或者負
數字外的一系列括號。這一部分,根一系列括號有關。如果括號前是+,則括號內部不需要變號,如果是負,則需要變號。因此括號前的符號特別重要,且括號是由作用範圍的,以正括號開始,反括號結束,所以需要用棧stk來儲存符號,且棧頂stk.top()表示的是當前的符號。
c++實現如下:
class
solution
else
if(s[i]
=='+'
)else
if(s[i]
=='-'
)else
if(s[i]
=='('
)else
if(s[i]
==')'
)else
ans +
= sign * num;}}
return ans;}}
;
測試結果:
複雜度分析:
由於水平有限,部落格中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!
推薦文章
LeetCode 224 基本計算器 每日一題
224.基本計算器 實現乙個基本的計算器來計算乙個簡單的字串表示式s的值。先附上乙個大佬的做法,兩個棧乙個記錄數字,乙個記錄左括號前面的符號f,這樣當遇到右括號的時候直接將棧頂的值加上f 括號內的值,很簡便的做法 class solution ans sign num else if str i e...
每日一題 小計算器(模擬)
資源限制 時間限制 1.0s 記憶體限制 256.0mb daily english 當乙個好人受到傷害,所有的好人定將與其同歷磨難。when a good man is hurt,all who would be called good must suffer with him.模擬程式型計算器,...
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...