227. 基本计算器 II - medium
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2" 输出:7
示例 2:
输入:s = " 3/2 " 输出:1
示例 3:
输入:s = " 3+5 / 2 " 输出:5
提示:
1 <= s.length <= 3 * 105
s
由整数和算符('+', '-', '*', '/')
组成,中间由一些空格隔开s
表示一个 有效表达式- 表达式中的所有整数都是非负整数,且在范围
[0, 231 - 1]
内 - 题目数据保证答案是一个 32-bit 整数
与 1048. 笨阶乘 类似.
class Solution:
def calculate(self, s: str) -> int:
vs = [0]
for v in s:
if v == ' ':
continue
if v in ['+', '-', '*', '/']:
vs.append(v)
vs.append(0)
else:
vs[-1] *= 10
vs[-1] += int(v)
st = [vs[0]]
i = 1
while i < len(vs):
n = vs[i]
if n == '+':
st.append(vs[i + 1])
elif n == '-':
st.append(-vs[i + 1])
elif n == '*':
st[-1] *= vs[i + 1]
elif n == '/':
st[-1] = int(st[-1] / vs[i + 1])
i += 2
return sum(st)
参考题解,一遍遍历计算结果
class Solution:
def calculate(self, s: str) -> int:
n = len(s)
vs = []
preSign = '+'
num = 0
for i in range(n):
if s[i] != ' ' and s[i] not in '+-*/':
num *= 10
num += int(s[i])
# 最后一次 i == n 时,也要走这个分支
if i == n - 1 or s[i] in '+-*/':
if preSign == '+':
vs.append(num)
elif preSign == '-':
vs.append(-num)
elif preSign == '*':
vs[-1] *= num
else:
vs[-1] = int(vs[-1] / num)
preSign = s[i]
num = 0
return sum(vs)