模擬: 逆序波蘭表達式的計算 Evaluate Reverse Polish Notation_Leetcode 150

閱讀時間約 6 分鐘

題目敘述

題目會給我們一個輸入陣列tokens,裡面以逆序波蘭表達式的方式儲存各個token,請問最後計算完的值是多少?

例如: ["6", "2", "/"]

代表 6 / 2 =3


題目的原文敘述


測試範例

Example 1:

Input: tokens = ["2","1","+","3","*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Example 2:

Input: tokens = ["4","13","5","/","+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6

Example 3:

Input: tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output: 22
Explanation: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

約束條件

Constraints:

  • 1 <= tokens.length <= 10^4

輸入陣列的長度1 ~ 一萬之間。

  • tokens[i] is either an operator: "+""-""*", or "/", or an integer in the range [-200, 200].

每個token一定是四則運算符號,或者介於-200~200之間的整數。


演算法 用stack進行模擬

這題應該滿多讀者在以前的資料結構或者演算法上課的時候看過類似的題目,給一串波蘭表達式,對這個波蘭表達式計算求值。

這題也是,而且已經講明了是逆序表達式,也就是說,所有的計算順序可以抽象的表達成:

日常生活中的 a 運算子 b <=> 以 a, b, 運算子 的逆序波蘭表達式出現
其中,運算子可以是 加+, 減-, 乘*, 除/
題目還規定,做除法的時候一率Truncate to zero,捨去小數點部分

模擬的時候,先建立一個空的stack,依序掃描每個token。

假如遇到數字,就把這個數字轉型為int,推入到stack的頂端儲存起來。

假如遇到四則運算子,就pop出來最頂端的兩個運算元,用對應的運算子去計算,再把計算完的值推入stack的頂端。


程式碼 用stack進行模擬

class Solution(object):
def evalRPN(self, tokens):

# Use stack to store operands
stack = []

operator = set("+-*/")

for token in tokens:

if token not in operator:
# Casting from string to integer
stack.append( int(token) )
continue

# Get first operand and second operand
second, first= stack.pop(), stack.pop()

if token == "+":
result = first + second
elif token == "-":
result = first - second
elif token == "*":
result = first * second
else:
# Truncates toward zero, defined in description
result = int(first / second)

stack.append(result)
# ========================================
return stack.pop()

複雜度分析 用stack進行模擬

時間複雜度:

從左到右檢查每個token,每個token最多push, pop各一次,所需時間為O(n)。

空間複雜度:

需要一個stack去儲存每個operand,所需空間最長為O(n)。


關鍵知識點

日常生活中的 a 運算子 b <=> 以 a, b, 運算子 的逆序波蘭表達式出現
其中,運算子可以是 加+, 減-, 乘*, 除/
題目還規定,做除法的時候一率Truncate to zero,捨去小數點部分

模擬的時候,先建立一個空的stack,依序掃描每個token。

假如遇到數字,就把這個數字轉型為int,推入到stack的頂端儲存起來。

假如遇到四則運算子,就pop出來最頂端的兩個運算元,用對應的運算子去計算,再把計算完的值推入stack的頂端。


82會員
418Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們一顆二元樹的根節點。請問在這棵樹中,之字型走法的路徑長度最大值是多少? 如果無解,請返回 零。 註: 之字型走法就是有一段路徑,都是由連續的 左右左右...,或者 右左右左...所構成的路徑。(看下方的測試範例會更清楚題目的定義) 題目的原文敘述 測試範例 E
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
題目敘述 題目會給定一個二元樹的樹根結點Root node,要求我們計算這顆二元樹的最大深度是多少? 二元樹的深度的定義: 從根結點到葉子結點的最大路徑長度。 題目的原文敘述 約束條件 Constraints: The number of nodes in the tree is
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
題目敘述 題目會給我們一顆二元樹的根節點。請問在這棵樹中,之字型走法的路徑長度最大值是多少? 如果無解,請返回 零。 註: 之字型走法就是有一段路徑,都是由連續的 左右左右...,或者 右左右左...所構成的路徑。(看下方的測試範例會更清楚題目的定義) 題目的原文敘述 測試範例 E
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
題目敘述 題目會給定一個二元樹的樹根結點Root node,要求我們計算這顆二元樹的最大深度是多少? 二元樹的深度的定義: 從根結點到葉子結點的最大路徑長度。 題目的原文敘述 約束條件 Constraints: The number of nodes in the tree is
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一部改編自真人真事,上帝藉驅魔士之手與惡魔交鋒的精彩實戰實錄, 全片以驚人的特殊化妝、電腦特效與奧斯卡影帝羅素 ‧ 克洛(Russell Crowe) 的精湛演技,融合了懸疑、推理與步步驚悚的氛圍,信仰與誘惑、懺悔與噩夢,面對心中最深的恐懼,究竟誰能堅持到最後?
Thumbnail
我開始提供協助公務員商調模擬面試的服務,大概兩個月左右了,累積了一些來訪者的反饋以及諮詢過程中的感覺,整理出三個我覺得這樣的面試服務真的很有幫助的地方。
準與不準,除了糾結於軟體本身,演算法,數值方法這些東西以外,其實更重要的是一個問題的複雜度。任何一套軟體,拿去做物理課本例題上面的簡單問題,都沒毛病,而且和實驗一致。但是為什麼模擬軟體能發揮的功能依舊有限?
預測產品行為 預測性的成果,精神上就相當於經驗公式,具體就會像是Intel或AMD所提供的CPU thermal model這種。經過校正後的模型得出的結果在誤差上原則可以小於5%,可以用來預測產品行為,提供廠商開發散熱片的模型。一個模型要準,勢必得投入測量值去校正材料參數或是取得等效參數。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
在作模擬的時候,這個準不準這個問題絕對有資格被排在常見問題中的前三名。 當然也是我們首先要問自己的部分。如果人家要拿這份結果去做設計評估,那他的準確性到哪? 如果不能拿來做設計參考,那我們該怎麼解讀? 而準不準的問題,要分成事前諸葛和事後諸葛兩種應用來討論。 事後諸葛的類型 事前諸葛的類型
六月有兩個任務:一是要模擬檢查子宮內膜厚度、二是要照輸卵管攝影。 6/16:愛群開兩週內膜藥,藥物作用是提供雌激素。 6/20:預計月經來,開始用口服,在量多的第二天開始吃。 6/28 +- 2天:已預約6/28 8:30輸卵管攝影,施作前要空腹4小時,避免檢查時吐出來。 8/7:最快植入日
Thumbnail
PS5于2020年11月12日正式上市,距离现在仅有一年半的时间,也是目前最火的次时代主机,但没想到的是,PS4模拟器都还没成熟呢,PS5模拟器已经出来了! 开发商InoriRus发布了首个PC平台的PS5模拟器「Kyty」。
Thumbnail
可能包含敏感內容
每每獨處時刻 我都會思考 那晚 我要的是什麼 是那個人 亦或是 排解寂寞的 稱為愛的安全感 不 我就是個骯髒的人 我要的不過是 被用力撞擊的感受 抓緊被單 無法抑制的聲音 一直以來都是書寫著錯誤的答案 現在只不過是改正而已 所有的詭譎 僅僅是 不習慣 諸多錯誤的答案中 你為什麼這麼
Thumbnail
一元是意識推理出來的,人有意識,是二元,所以只能模擬一元。 意識是二元,就算最原始的意識也一樣,神佛上帝也是二元,都在 do something,都在創造。   我們說靈修是回去一元,應該不對,一元就不是意識了,應該說是去模擬一元,模擬一元的清靜,靈修是必要的,每個人多多少少都想過修
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一部改編自真人真事,上帝藉驅魔士之手與惡魔交鋒的精彩實戰實錄, 全片以驚人的特殊化妝、電腦特效與奧斯卡影帝羅素 ‧ 克洛(Russell Crowe) 的精湛演技,融合了懸疑、推理與步步驚悚的氛圍,信仰與誘惑、懺悔與噩夢,面對心中最深的恐懼,究竟誰能堅持到最後?
Thumbnail
我開始提供協助公務員商調模擬面試的服務,大概兩個月左右了,累積了一些來訪者的反饋以及諮詢過程中的感覺,整理出三個我覺得這樣的面試服務真的很有幫助的地方。
準與不準,除了糾結於軟體本身,演算法,數值方法這些東西以外,其實更重要的是一個問題的複雜度。任何一套軟體,拿去做物理課本例題上面的簡單問題,都沒毛病,而且和實驗一致。但是為什麼模擬軟體能發揮的功能依舊有限?
預測產品行為 預測性的成果,精神上就相當於經驗公式,具體就會像是Intel或AMD所提供的CPU thermal model這種。經過校正後的模型得出的結果在誤差上原則可以小於5%,可以用來預測產品行為,提供廠商開發散熱片的模型。一個模型要準,勢必得投入測量值去校正材料參數或是取得等效參數。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
在作模擬的時候,這個準不準這個問題絕對有資格被排在常見問題中的前三名。 當然也是我們首先要問自己的部分。如果人家要拿這份結果去做設計評估,那他的準確性到哪? 如果不能拿來做設計參考,那我們該怎麼解讀? 而準不準的問題,要分成事前諸葛和事後諸葛兩種應用來討論。 事後諸葛的類型 事前諸葛的類型
六月有兩個任務:一是要模擬檢查子宮內膜厚度、二是要照輸卵管攝影。 6/16:愛群開兩週內膜藥,藥物作用是提供雌激素。 6/20:預計月經來,開始用口服,在量多的第二天開始吃。 6/28 +- 2天:已預約6/28 8:30輸卵管攝影,施作前要空腹4小時,避免檢查時吐出來。 8/7:最快植入日
Thumbnail
PS5于2020年11月12日正式上市,距离现在仅有一年半的时间,也是目前最火的次时代主机,但没想到的是,PS4模拟器都还没成熟呢,PS5模拟器已经出来了! 开发商InoriRus发布了首个PC平台的PS5模拟器「Kyty」。
Thumbnail
可能包含敏感內容
每每獨處時刻 我都會思考 那晚 我要的是什麼 是那個人 亦或是 排解寂寞的 稱為愛的安全感 不 我就是個骯髒的人 我要的不過是 被用力撞擊的感受 抓緊被單 無法抑制的聲音 一直以來都是書寫著錯誤的答案 現在只不過是改正而已 所有的詭譎 僅僅是 不習慣 諸多錯誤的答案中 你為什麼這麼
Thumbnail
一元是意識推理出來的,人有意識,是二元,所以只能模擬一元。 意識是二元,就算最原始的意識也一樣,神佛上帝也是二元,都在 do something,都在創造。   我們說靈修是回去一元,應該不對,一元就不是意識了,應該說是去模擬一元,模擬一元的清靜,靈修是必要的,每個人多多少少都想過修