Leetcode 227.基本计算机II

Leetcode 227.基本计算机II

1. 思路

(1)这道题要求实现基本计算机,一个字符串,有数字和非数字即运算符,这道题只有 + - * / 四种运算符,计算字符串的结果首先我就想到了用栈的思想,一开始两个栈一个存放 运算符,一个存放数字,空间占用很大;
(2)采用先计算乘除,结果存入栈内,再计算 栈内的+ -
(3)给出一开始写的,但总是通不过 ,就很离谱,把错误的也贴一下
注:ord()函数是将字符转化为ASCII,所以ord(s[i]) - ord(‘0’)就得到数字的大小
isdigit()函数是判断是否为数字的函数

2.步骤

(1)定义栈、常量等,(为什么pre_sign = '+'赋值为+ 因为+初始是不影响计算结果,本来字符串就是求所有字符的运算”和“)
(2)for 循环
if 判断当前字符是否不为空以及是否为数字,如果是,则转化为数字
if 判断非数字,即运算符,这里有一个条件是当i已经遍历到最后一个元素了,或者当前元素属于±*/中的一个运算符,判断属于哪种运算符号
+或-直接入栈
*或/ 先将栈顶元素弹出,与当前元素运算,再入栈;

     结束求和 sum(stack)
class Solution:
	def calculate(self,s):
		n = len(s)
		num = 0
		pre_sign = '+'
		stack = []
		for i in range(n):
			if s[i] != ' ' and s[i].isdigit():
				num = num*10 + ord(s[i]) - ord('0')
			if i == n-1 or s[i] in '+-*/':
				if pre_sign == '+':
					stack.append(num)
				elif pre_sign  == '-':
					stack.append(-num)
				elif pre_sign == '*':
					stack.append(stack.pop()*num)
				else:
					stack.append(stack.pop()//num)
				pre_sign = s[i]
				num = 0
		return sum(stack)
					

Leetcode 227.基本计算机II
这个"14-3/2"用例一直通不过,看了其他大佬的才知道,是python的小坑,// 是向下取整,所以如果是负数的会通不过,直接选择int (stack.pop()/num)

stack.append(int(stack.pop()/num))

Leetcode 227.基本计算机II

上一篇:时间序列数据的样本熵


下一篇:[补]NOIP2020T4微信步数