实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种思路:
作弊法。
class Solution(object):
def calculate(self, s):
"""
:type s: str
:rtype: int
"""
return eval(s)第二种思路:
三步走:
1. 将数字和运算符分离
2.优先计算乘除法
3. 最后计算加减法
class Solution(object):
def calculate(self, s):
"""
:type s: str
:rtype: int
"""
s = s.replace(" ", "")
stack = []
operation = []
i = 0
while i < len(s): #分离数字和运算符
if s[i].isdigit():
cur = int(s[i])
while i + 1 < len(s) and s[i + 1].isdigit():
cur = cur * 10 + int(s[i + 1])
i += 1
stack.append(cur)
else:
operation.append(s[i])
i += 1
print stack, operation
i = 0
while i < len(operation): #处理乘除法
op = operation[i]
if op == "*":
stack[i] = stack[i] * stack[i + 1]
stack = stack[:i + 1] + stack[i + 2:]
operation = operation[:i] + operation[i + 1:]
elif op == "/":
stack[i] = stack[i] // stack[i + 1]
stack = stack[:i + 1] + stack[i + 2:]
operation = operation[:i] + operation[i + 1:]
else:
i += 1
# print stack, operation
res = stack[0]
for i in range(len(operation)): #计算加减法
op = operation[i]
if op == "+":
res += stack[i + 1]
elif op == "-":
res -= stack[i + 1]
return res第三种思路:
学习自评论区,优雅的解法。
import operator
class Solution(object):
def calculate(self, s):
"""
:type s: str
:rtype: int
"""
res = []
calculate = {
"+": lambda x: res.append(x),
"-": lambda x: res.append(-x),
"*": lambda x: res.append(x * res.pop()),
"/": lambda x: res.append(int(operator.truediv(res.pop(), x)))
}
op = "+"
num = 0
for char in s + "+":
if char.isdigit():
num = num * 10 + int(char)
elif char != " ":
calculate[op](num)
op, num = char, 0
# print res
return sum(res)
版权声明:本文为qq_32424059原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。