leetcode_227.基本計算機II


目次
一、テーマの内容
二、問題を解く構想
三、コード
一、テーマの内容
文字列式sをあげます.基本計算機を実現して値を計算して返してください.
整数除算では、整数部分のみが保持されます.
例1:
入力:s="3+2*2"出力:7
例2:
入力:s="3/2"出力:1
例3:
入力:s="3+5/2"出力:5
ヒント:
1<=s.length<=3*10^5 sは整数と演算子('+','-','*','/')からなり、中間にいくつかのスペースで区切られたsは有効な式式式のすべての整数が非負の整数であることを示し、範囲[0,2^31-1]内の問題データは答えが32-bit整数であることを保証する.
二、問題を解く構想
とleetcode_224.基本計算機の考え方は似ていて、スタックで保存しますが、今回のスタックには2つの数の直接的な計算結果しか保存されていません.Pythonでの除算は負数処理の問題に注意してください.
三、コード
class Solution:
    def calculate(self, s: str) -> int:
        stack = []
        res = 0
        flag = '+'
        cur_num = 0
        i = 0
        while i < len(s):
            if ord(s[i]) >= ord('0'):
                cur_num = cur_num * 10 + ord(s[i]) - ord('0')
            if (ord(s[i]) < ord('0') and s[i] != ' ') or i == len(s) - 1:
                if flag == '+':
                    stack.append(cur_num)
                elif flag == '-':
                    stack.append(-cur_num)
                elif flag == '*':
                    stack.append(stack.pop() * cur_num)
                elif flag == '/':
                    if stack[-1] % cur_num == 0:
                        stack.append(stack.pop() // cur_num)
                    else:
                        stack.append(stack.pop() // cur_num if stack[-1] >= 0 else stack.pop() // cur_num + 1)
                flag = s[i]
                cur_num = 0
            i += 1

        while len(stack) != 0:
            res += stack.pop()
        return res




if __name__ == '__main__':
    ss = Solution()
    # s = " 3+5 / 2 "
    # s = "14-3/2"
    s = "10000-1000/10+100*1"
    ans = ss.calculate(s)
    print(ans)