iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

題目說明

這題也是計算機的題目,跟前一題的差別在於,這次的式子有包含加減乘除,但是沒有括號
所以相對於第 224 題,這是比較簡單一些的題目(因此只有 Medium)

思路解析

與上一題一樣,這題也會遍歷整個式子後,將式子中的 digit 與 sign 還有空格分別處理

  1. 當遇到 digit 時,一樣一路找到不是 digit 的字串為止
  2. 當遇到 sign 時,依據加減乘除號有不同的處理方式,注意這邊會是在遇到下一個 sign 後,才去處理先前的 sign 所造成的結果
    • "+": 直接將值放到 stack 中
    • "-": 將值乘上 -1 後放到 stack 中
    • "*": 將 stack 中的值 pop 出來並乘上當前的值
    • "/": 將 stack 中的值 pop 出來後除當前的值(要無條件捨去,在 python 裡要特別注意被除數為負數時的結果會不同)
  3. 當遇到式子中的最後一個值時,也要重複步驟 2 的方式

最後所有的計算結果都已經在 stack 內了,所以就可以把所有的值拿出來即為所求

程式碼

class Solution:
    def calculate(self, s: str) -> int:
        num, sign, stack = 0, "+", []
        # s = s.strip()
        
        for i in range(len(s)):
            c = s[i]
            if c.isdigit():
                num = num * 10 + int(c)
                
            if c in ['+','-','*','/'] or len(s) - 1 == i: 
                # 遇到當前符號,才去計算前一個符號的結果是什麼
                if sign == '+':
                    stack.append(num)
                elif sign == '-':
                    stack.append(num * -1)
                elif sign == '*':
                    stack.append(num * stack.pop())
                elif sign == '/':
                    curr = stack.pop()            
                    curr = abs(curr)//num * -1 if curr < 0 else curr // num
                    stack.append(curr)
                
                # 記下當前符號
                sign = c
                
                # num 歸零
                num = 0
            
        res = 0
        for n in stack:
            res += n
        return res

上一篇
Day 23 - 224. Basic Calculator
下一篇
Day 25 - 232. Implement Queue using Stacks
系列文
Leetcode 習慣養成之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言