【一天一道Leetcode】基本计算器
共 2559字,需浏览 6分钟
·
2021-03-14 18:35
本篇推文共计2000个字,阅读时间约3分钟。
01
题目描述
题目描述:
实现一个基本的计算器来计算一个简单的字符串表达式s的值。
示例:
输入:s = "1 + 1"
输出:2
输入:s = " 2-1 + 2 "
输出:3
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1. 1 <= s.length <= 3 * 10^5
2. s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
3. s 表示一个有效的表达式
02
方法和思路
由题目可知,
本题需要注意的要点有两个
1.由题目可知只有“+”,“-”运算,没有“*”,“/”运算,因此少了不同运算符优先级的比较,可以从左到右计算。
2.题目中会遇到小括号的情况,应该首先算出括号里面的表达式。
根据分析,我觉得可以用eval函数来解答本题:
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
一个关于的eval()函数的例子如下所示:
x = 7
eval( '5 * x' )
输出:35
eval('2 + 2')
输出:4
因为字符串中可能会含有"("和")"
如果直接使用eval()计算的话
leetcode系统会出现报错
如下所示:
但是用自己电脑运行的话,不会出错:
电脑本地跑试含有"("和")"的字符串表达式:
s="(1+(4+5+2)-3)+(6+8)"
print(eval(s))
输出为:23
所以为了让代码可以在leetcode系统中运行,
我们可以由内而外地分批次使用eval()计算式
这里我们使用rfind()与find()来解决。
关于rfind()的介绍如下:
rfind() 返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。
用法如下:
str.rfind(str, beg=0 end=len(string))
• str -- 查找的字符串
• beg -- 开始查找的位置,默认为 0
• end -- 结束查找位置,默认为字符串的长度。
rfind()举例用法如下:
s="(1+(4+5+2)-3)"
a=s.rfind('(')
print("最后一次出现'('的字符串位数是:",a)
输出为
最后一次出现'('的位数是:3
find() 方法检测字符串中是否包含子字符串 str ,
如果指定 beg(开始) 和 end(结束) 范围,则
检查是否包含在指定范围内,
如果包含子字符串返回开始的索引值,否则返回-1
str.find(str, beg=0, end=len(string))
• str -- 指定检索的字符串
• beg -- 开始索引,默认为0。
• end -- 结束索引,默认为字符串的长度。
判断左右小括号的位置,优先计算小括号里面的表达式子数值
s="(1+(4+5+2)-3)"
a=s.rfind('(')
b=s.find(')',a)
print("最后一次出现'('的字符串位数是:",a)
print("从第2个'('开始的最近一个')'的位置是",b)
输出为:
最后一次出现'('的字符串位数是:3
从第2个'('开始的最近一个')'的位置是 9
使用rfind()与find()的缘由是,
优先计算好了小括号里面的数值后,
将其转换为字符串的形式,
方便可以再次使用eval()函数
如以下所示:
str(eval(s[a:b+1]))
我们用代码表示如下:
class Solution:
def calculate(self, s: str) -> int:
while True:
a=s.rfind('(')
b=s.find(')',a)
if a==-1:
break
s=s[:a]+str(eval(s[a:b+1]))+s[b+1:]
return eval(s)
【年终总结】你好2021,再见2020。
【快速写好毕业论文】你不得不知晓的七个常用文献搜索平台
【秋招纪实录】一篇特别正经的【腾讯】求职经验分享
【一天一道Leetcode】回文字符串-最少分割次数
【一天一道Leetcode】用栈实现队列
【一天一道Leetcode】套信封问题
你与世界
只差一个
公众号