计算器大冲关
第一关加减乘除
核心,两头添两个+
思想是 把operation记住,然后现存数字是operation后面的数字,乘除的时候就可以pop出符号前面的数字,再和现存的数字做运算。
还有个巧妙的地方在于把减法当负号。最后就是sum(stack)里所有东西
另外
说下 python的 int() 取整和 //
Int取整简单粗暴就是截断,小数直接丢掉,就会呈现出,正数向下取,负数向上取。
5//2 = 2
-3 // 2 = -1
暴力截断即可
//全都是向下取整,取出来的数字就是变小。比如
5 // 2 = 2
-3//2 = -2
class Solution:
def calculate(self, s: str) -> int:
def operate(num, op):
if op == "*":
stack.append(num * stack.pop())
if op == "/":
stack.append(int(stack.pop() / num))
if op == "-":
stack.append(-1 * num)
if op == "+":
stack.append(num)
n = len(s)
i = 0
stack = []
cur = 0
operation = "+"
for char in s+"+":
if char.isdigit():
cur = cur*10 + int(char)
elif char in ["-", "+", "*", "/"]:
operate(cur, operation)
cur = 0
operation = char
return sum(stack)
第二关 带括号的加减:
这里括号的不同之处,在于要把前括号前面的op存进stack。因为括号里面的式子算好之后得找到括号前面的op,不存下来是会被冲掉的。 遇到后括号就要清算了,把到那个运算符的内容都算好。但清算之前记得还得做一次 operate函数,别漏了后括号前面的数字。 怎么去判断是不是一个 op而不是数字,可以用 isinstance(x,int)
class Solution:
def calculate(self, s: str) -> int:
def operate(num, op):
if op == "*":
stack.append(num * stack.pop())
if op == "/":
stack.append(int(stack.pop() / num))
if op == "-":
stack.append(-1 * num)
if op == "+":
stack.append(num)
stack = []
op = "+"
cur = 0
for char in s+"+":
if char.isdigit():
cur = cur * 10 + int(char)
elif char == "(":
stack.append(op)
op = "+"
elif char in ["+","-","*","/",")"]:
operate(cur , op)
if char == ")":
sum_in_bracket = 0
while isinstance(stack[-1], int):
sum_in_bracket += stack.pop()
op = stack.pop()
cur = sum_in_bracket
else:
cur = 0
op = char
else:
continue
return sum(stack)
第三关,继续升级,加减乘除,括号都有
突然发现 上一题已经把加减乘除做了,一不小心 把这个条件写成了
elif char in [“+”,“-”,“*”,“/”,“)”]:
其实上一题 没有乘除的要求,只要elif char in [“+”,“-”,“)”]:
版权声明:本文为weixin_41147129原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。