【一天一道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()的介绍如下:
find() 方法检测字符串中是否包含子字符串 str ,
如果指定 beg(开始) 和 end(结束) 范围,则
检查是否包含在指定范围内,
如果包含子字符串返回开始的索引值,否则返回-1

str.find(str, beg=0, end=len(string))
str -- 指定检索的字符串
• beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
判断左右小括号的位置,优先计算小括号里面的表达式子数值


find()举例用法如下:
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】套信封问题



☆ END ☆

你与世界

只差一个

公众号

浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报