「LeetCode系列」基本计算器问题|刷题打卡

185 阅读1分钟

作者:看那个码农

公众号:看那个码农

本题来源于「LeetCode系列」224. 基本计算器

题目描述:

实现一个基本的计算器来计算一个简单的字符串表达式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 表示一个有效的表达式

代码分析

由题目可知,

本题需要注意的要点有两个

1.由题目可知只有“+”,“-”运算,没有“*”,“/”运算,因此少了不同运算符优先级的比较,可以从左到右计算。

2.题目中会遇到小括号的情况,应该首先算出括号里面的表达式。

根据分析,我觉得可以用eval函数来解答本题:

eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])

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

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

x = 7 
eval( '5 * x' )
输出:35

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

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

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

leetcode系统会出现报错

如下所示:

image.png

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

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

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)

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情