前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【一天一道Leetcode】基本计算器

【一天一道Leetcode】基本计算器

作者头像
潘永斌
发布2021-03-29 16:45:14
3510
发布2021-03-29 16:45:14
举报
文章被收录于专栏:看那个码农看那个码农

题目描述:

实现一个基本的计算器来计算一个简单的字符串表达式s的值。

示例:

代码语言:javascript
复制
输入: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函数来解答本题:

代码语言:javascript
复制
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])

expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

一个关于的eval()函数的例子如下所示:

代码语言:javascript
复制
x = 7 
eval( '5 * x' ) 
输出:35

eval('2 + 2') 
输出:4

因为字符串中可能会含有"("和")"

如果直接使用eval()计算的话

leetcode系统会出现报错

如下所示:

但是用自己电脑运行的话,不会出错:

电脑本地跑试含有"("和")"的字符串表达式:

代码语言:javascript
复制
s="(1+(4+5+2)-3)+(6+8)"
print(eval(s))

输出为:23

所以为了让代码可以在leetcode系统中运行,

我们可以由内而外地分批次使用eval()计算式

这里我们使用rfind()与find()来解决。

关于rfind()的介绍如下:

代码语言:javascript
复制
rfind() 返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。
用法如下:
str.rfind(str, beg=0 end=len(string))
• str -- 查找的字符串
• beg -- 开始查找的位置,默认为 0
• end -- 结束查找位置,默认为字符串的长度。

rfind()举例用法如下:

代码语言:javascript
复制
s="(1+(4+5+2)-3)"
a=s.rfind('(')
print("最后一次出现'('的字符串位数是:",a)

输出为
最后一次出现'('的位数是:3

关于find()的介绍如下:

代码语言:javascript
复制
find() 方法检测字符串中是否包含子字符串 str ,
如果指定 beg(开始) 和 end(结束) 范围,则
检查是否包含在指定范围内,
如果包含子字符串返回开始的索引值,否则返回-1

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

find()举例用法如下:

代码语言:javascript
复制
s="(1+(4+5+2)-3)"
a=s.rfind('(')
b=s.find(')',a)
print("最后一次出现'('的字符串位数是:",a)
print("从第2个'('开始的最近一个')'的位置是",b)

输出为:
最后一次出现'('的字符串位数是:3
从第2个'('开始的最近一个')'的位置是 9

使用rfind()与find()的缘由是,

优先计算好了小括号里面的数值后,

将其转换为字符串的形式,

方便可以再次使用eval()函数

如以下所示:

代码语言:javascript
复制
str(eval(s[a:b+1]))

我们用代码表示如下:

代码语言:javascript
复制
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-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 看那个码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 02
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档