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での除算は負数処理の問題に注意してください.
三、コード
一、テーマの内容
二、問題を解く構想
三、コード
一、テーマの内容
文字列式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)