↓快轉到主要內容
  1. LeetCode/

LeetCode 227: Basic Calculator II

·1 分鐘· ·
LeetCode Medium Math String Stack
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-13

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

沒有括號,只有優先順序(Stack 模板一)。用 op 記住上一個運算子,掃到數字就累積成完整的數;遇到下一個運算子或字串結尾時處理 op:

  • +:push(num);-:push(-num)。
  • *、/:跟 stack 頂端算完放回去,除法要往 0 截斷(int(a / b))。

最後加總 stack。乘除當場算掉,加減留到最後,就符合優先順序。

我的嘗試
#

  • 第一版把字串轉成字元的 list,每個字元當成一個 token,多位數的數字被拆開了:"18" 回傳 1 之類的結果。
  • 第二版先把數字和運算子切成 token 才 AC,但做法是在 list 上用切片 s[i - 1:i + 2] = [結果] 原地取代,每次都要搬移後面的元素,O(n²);而且除法用的是 //,只有在數都是非負時才跟往 0 截斷一樣。

正確解法
#

class Solution:
    def calculate(self, s: str) -> int:
        st, num, op = [], 0, "+"
        for i, c in enumerate(s):
            if c.isdigit():
                num = num * 10 + int(c)
            if c in "+-*/" or i == len(s) - 1:
                if op == "+":
                    st.append(num)
                elif op == "-":
                    st.append(-num)
                elif op == "*":
                    st.append(st.pop() * num)
                else:
                    st.append(int(st.pop() / num))
                op, num = c, 0
        return sum(st)

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 數字可能有好幾位,要先讀完整。
  • 除法往 0 截斷:-3 / 2 是 -1,// 會得到 -2。
  • 最後一個數要在字串結尾處理。

面試口說整理
#

我記住上一個運算子,把數字讀完整,遇到下一個運算子或結尾時處理:加減把數放進 stack,減號放負數,乘除直接跟頂端算完放回去,最後加總。乘除當場算掉、加減留到最後,就符合優先順序。時間 O(n)。

相關文章

LeetCode 71: Simplify Path
·1 分鐘
LeetCode Medium String Stack
LeetCode 71 解題筆記:用 / 切開,空字串和 . 跳過,.. 就 pop(根目錄不能再往上),其他名稱 push,最後用 / 接起來
LeetCode 43: Multiply Strings
·1 分鐘
LeetCode Medium Math String Simulation
LeetCode 43 解題筆記:num1[i] × num2[j] 的結果落在第 i + j + 1 位,用一個長度 n + m 的陣列累加後再統一進位
LeetCode 151: Reverse Words in a String
·1 分鐘
LeetCode Medium Two-Pointers String
LeetCode 151 解題筆記:split() 不帶參數會把連續空白當成一個分隔,也會去掉頭尾空白;反轉後用一個空白接起來
LeetCode 189: Rotate Array
·1 分鐘
LeetCode Medium Array Math Two-Pointers
LeetCode 189 解題筆記:先 k %= n,再用三次反轉:整個反轉、前 k 個反轉、後 n - k 個反轉;O(1) 額外空間
LeetCode 204: Count Primes
·1 分鐘
LeetCode Medium Array Math Enumeration Number-Theory
LeetCode 204 解題筆記:埃氏篩,只用質數 p 從 p² 開始把倍數劃掉,外層只要到 √n
LeetCode 93: Restore IP Addresses
·1 分鐘
LeetCode Medium String Backtracking
LeetCode 93 解題筆記:切成剛好 4 段,每段長度 1 到 3、值在 0 到 255、除了 0 本身不能有前導零