[LeetCode]227. 基本计算器 II(Basic Calculator II)

题目描述

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:

输入: “3+2*2”
输出: 7

示例 2:

输入: “ 3/2 “
输出: 1

示例 3:

输入: “ 3+5 / 2 “
输出: 5

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval。

解题思路

先按照加号或者减号进行切分,对于其中的每一部分按照从前至后计算乘除法,把最后的结果根据原先的加减号合起来。

代码

Python 3.6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution:
def calculate(self, s: str) -> int:
res = []
minus = [1]
tmp_s = ""
for char in s:
if char == " ":
continue
elif char == "+" and tmp_s != "":
res.append(tmp_s)
tmp_s = ""
minus.append(1)
elif char == "-":
if len(tmp_s) == 0:
minus = [-1]
else:
minus.append(-1)
res.append(tmp_s)
tmp_s = ""
else:
tmp_s += char
res.append(tmp_s)
val = 0
for idx, sub_s in enumerate(res):
val += minus[idx] * self.cal_prod_div(sub_s)
return val

def cal_prod_div(self, s):
res = 1
tmp_s = ""
last_cal = "*"
for idx, char in enumerate(s):
if char == "*" or char == "/" or idx == len(s) - 1:
num = int(tmp_s) if idx != len(s) - 1 else int(tmp_s + char)
if last_cal == "*":
res *= num
elif last_cal == "/":
res //= num
tmp_s = ""
last_cal = char
else:
tmp_s += char
return res

执行用时:184 ms
内存消耗:15.4 MB