5.5逆波兰表达式求值(LC150-M)

news2024/11/25 6:37:29

算法:

其实就是后缀表达式。

本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了。

看到数字就push入栈

看到操作符,就对栈顶的2个元素运算

然后把结果继续push入栈

可以用到的函数:

eval() 是一个内置函数,用于将字符串作为表达式进行求值并返回结果。

它的语法如下: eval(expression, globals=None, locals=None)

`expression` 是一个字符串,表示要求值的表达式。

`globals` (可选) 是一个字典,用于指定全局命名空间中的变量和函数。如果未提供该参数,则使用当前全局命名空间。

`locals` (可选) 是一个字典,用于指定局部命名空间中的变量和函数。如果未提供该参数,则使用当前局部命名空间。

`eval()` 函数的工作原理如下:

1. 接收一个字符串表达式作为输入。

2. 解析并评估表达式中的代码。

3. 返回表达式的结果。返回值是一个float

`eval()` 函数可以用于执行简单的数学运算、执行动态代码和计算复杂的表达式。它非常灵活,可以接受包含变量、函数调用和各种操作符的表达式。 然而,需要注意的是,使用 `eval()` 函数时存在一些安全风险。因为它可以执行任意的代码,所以如果表达式来自不受信任的来源,可能会导致安全漏洞。因此,在实际应用中,应该谨慎使用 `eval()` 函数,并确保只对可信的输入进行求值。 如果您有任何进一步的问题,请随时提问。

调试过程:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        self.stack = []
        ##举例12/
        for item in tokens:
            if item != "+" and item != "-" and item != "*" and item != "/":
                self.stack.append(item)
                #压入1、2
            else:
                
                second_num = self.stack.pop()#先弹出的是2
                first_num = self.stack.pop()#再弹出的是1
                #eval计算的结果为float:0.50000,所以要转成int,变成0
                res = int(eval(f"{first_num}{item}{second_num}"))
                #再把计算的结果push入栈,继续计算
                self.stack.append(res)
        
        return int(res)## 如果一开始只有一个数,那么会是字符串形式的

原因:在 `res` 变量被引用之前,它没有被赋值。在您的代码中,`res` 变量只在 `else` 语句块中定义和使用。如果 `tokens` 列表为空,或者不包含任何运算符,那么 `else` 语句块将不会执行,导致 `res` 变量没有被赋值。

正确代码:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        self.stack = []
        ##举例12/
        for item in tokens:
            if item != "+" and item != "-" and item != "*" and item != "/":
                self.stack.append(item)
                #压入1、2
            else:
                
                second_num = self.stack.pop()#先弹出的是2
                first_num = self.stack.pop()#再弹出的是1
                #eval计算的结果为float:0.50000,所以要转成int,变成0
                res = int(eval(f"{first_num}{item}{second_num}"))
                #再把计算的结果push入栈,继续计算
                self.stack.append(res)
        
        return int(self.stack.pop())# 如果一开始只有一个数,那么会是字符串形式的

注意:

eval那里有个"f"

在Python中,`f` 是格式化字符串(Formatted String)的前缀,用于创建包含表达式的字符串。

通过在字符串前面加上 `f` 前缀,可以在字符串中插入变量、表达式或函数调用的结果。

如果没有f,那么字符串将不再是一个格式化字符串,而是一个普通的字符串。

在这种情况下,`eval()` 函数将直接对字符串 `'{first_num} {item} {second_num}'` 进行求值,而不会替换其中的变量。

时间空间复杂度

时间复杂度分析:

  • 遍历 `tokens` 列表,时间复杂度为 O(n),其中 n 是 `tokens` 列表的长度。
  • 在遍历过程中,对于每个操作符,执行了一次 `self.stack.pop()` 操作,时间复杂度为 O(1)。
  • 使用 `eval` 函数进行表达式计算,时间复杂度取决于表达式的长度和复杂度。在最坏情况下,表达式长度为 O(n),其中 n 是操作数和操作符的总数。
  • 将计算结果压入栈中,时间复杂度为 O(1)。

综上所述,总体时间复杂度为 O(n)。

空间复杂度分析:

  • 使用了一个栈 `self.stack` 来存储操作数,空间复杂度取决于栈中元素的数量。在最坏情况下,栈中元素数量为 n/2,其中 n 是操作数和操作符的总数。
  • 使用了一个变量 `res` 来存储计算结果,空间复杂度为 O(1)。

综上所述,总体空间复杂度为 O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1179619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL JDBC连接详解(附DEMO)

PostgreSQL JDBC连接详解 PostgreSQL JDBC连接详解摘要引言1. JDBC基础1.1 JDBC简介1.2 JDBC驱动程序1.3 建立JDBC连接 2. 配置PostgreSQL JDBC连接2.1 PostgreSQL连接JDBC2.2 PostgreSQL连接JDBC是否成功2.3 PostgreSQL连接JDBC获取表信息注释等2.4 PostgreSQL连接JDBC根据表名…

Unity热更新那些事

目录 热更新方案Unity程序的两种编译方式编译阶段执行阶段Mono方式IL2CPP方式两种方式打包以后的项目目录结构 其他 ILRuntime热更新ILRuntime使用注意ILRuntime的实现原理ILRuntime的性能优化建议ILRuntime的性能优化建议 HybridCLR热更新 参考链接 Unity热更新那些事 一小时极…

关闭 win10自动更新、关闭激活

做工控或者数据大屏、服务器之类的,都不想系统自动更新,不知不觉自动重启类。 激活过了一段时间,又要重新激活这些事情,所以需要手工去关闭这些服务。 一、关闭 win10自动更新 首先打开 服务,找到windows update: window +R 输入:Services.msc 停止windows update ,然…

Python 海龟绘图基础教学教案(六)

Python 海龟绘图——第 9 题 题目:绘制下面的图形 解析: 综合应用,绘制长方形。 答案: 不使用循环。 Python 海龟绘图——第 10 题 题目:绘制下面的图形 解析: 综合命令使用。 答案: 使用循环…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候,需要对两张表进行…

【ES分词】

分词 #测试分词器 POST /_analyze {"text": "小米手机和华为手机都是国产mobilephone", "analyzer": "english" }不管analyzer是改成:standard还是chinese都无法实现中文分词。 处理中文分词一般采用IK分词器 安装链接&…

Mongoose 开源库--json 使用笔记

一、 json相关API mongoose 开源库可以使用json进行数据处理。 ①创建json字符串 // A helper macro for printing JSON: mg_snprintf(buf, len, "%m", MG_ESC("hi")) #define MG_ESC(str) mg_print_esc, 0, (str) char *mg_mprintf(const char *fmt, ...)…

银行项目网上支付接口调用测试实例详解

前言 公司最近有一个网站商城项目要开始开发了,这几天老板和几个同事一起开着需求会议,讨论了接下来的业务规划和需求策略,等技术需求一下来还要讨论技术需求,确认后再慢慢的进入开发阶段,趁着闲暇时间想总结一下进入…

【0基础学Java第七课】-- 类和对象02

7.类和对象02 7.6 封装7.6.1 封装的概念7.6.2 访问限定符7.6.3封装扩展之包a.包的概念b. 导入包中的类c. 自定义包d 常见的包 7.7 static 成员7.7.2 静态修饰成员变量7.7.4 static修饰成员方法7.7.5 static成员变量初始化 7.8 代码块7.8.1 代码块概念以及分类7.8.2 普通代码块7…

Linux个性化登录提示信息

在Linux系统中,您可以为每个用户登录后显示个性化的提示信息。这通常通过修改用户的shell配置文件来实现,这个文件通常是用户的.bashrc或.bash_profile文件。以下是一些示例步骤,来实现这个目标: 打开终端并登录到Linux系统。 使…

AI:64-基于深度学习的口罩佩戴检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

“2024上海智博会”为我国智能科技产业发展注入新的动力

作为开年智能科技第一展“2024上海智博会”将于2024年三月份在国际大都市上海隆重召开,本届展会将充分展示我国智能科技产业新技术、新产品及未来发展方向。 据悉,本届展会将汇聚全球智能科技产业的领军企业和人物,共同探讨和分享最新的技术趋…

Mysql8与mariadb的安装与常用设置

一、v10服务器mariadb的安装与常用设置 V10服务器默认安装了mariadb数据库。也可使用命令sudo yum install mariadb手动安装或升级默认安装的版本。 1.1 修改数据库密码 systemctl restart mariadb,重启mariadb服务;mysql -u root -p,要求输入密码直接回车&#…

贝叶斯建模:从先验合理性到后验分布

一、说明 本文探讨贝叶斯模型,首先用摸球游戏展开模型构建步骤,然后讨论分类算法,以及实际操作方法:网格法、二次近似、蒙特卡洛。 二、针对贝叶斯的模型构建 2.1 分支剪枝和假设 在贝叶斯分析中,我们可以将这个过程想…

【C++】多文件的代码规范

算是C嘎嘎入门教程(但至少需要知道HelloWorld怎么写 内容不能说全,因为是想到哪写到哪,再次就是C是真的很杂。 (写完后博文编辑器提示我,本文章可能要20分钟读完,做好心理准备… 1、头文件(*.h)、源文件(*.cpp) 头文件…

bin.zip和bin.tar.gz以及src.zip和src.tar.gz以及rpm和dmg的区别

下载JDK时Java Downloads | Oracle会有很多文件,时间长了容易混淆,在此记录一下。 如上面三张图所示: bin代表二进制文件,是编译后的文件,而src是源码。.tar.gz是linux的压缩包,.zip是windows的压缩包 所以: bin.ta…

11.6哈夫曼树

创建哈夫曼树 经过这一步后,树的集合里就有n个叶子结点 不断从树集合里取出两个权重最小的树合并成一个新树,这时候就是两个根节点并成兄弟到一个新的根节点下,这个新的根节点的权重是两个兄弟的权重和,之后再把 每次合并的时…

32岁华为员工合同不续约,赔偿N+1,额外3个月年终奖,加班费10万+,总共25万多...

各位中生代社区的读者大大们好,我是你们的老朋友大白:) 一直以来,IT行业都有着“程序员是吃青春饭”的说法,这一年龄危机甚至逐渐演变为“45岁退休,35岁换人”的段子。 作为国内知名互联网大厂,华为近几年就曾几次三番…

Bash脚本实现Linux开机自启Redis,Nginx,MySQL等服务

一. MySQL服务自启 在CentOS 7及以上版本,MySQL以服务形式进行启动,运行两行命令即可实现。 systemctl start mysqld systemctl enable mysqld 只需运行一次即可实现MySQL开机自启动 二. 编写bash脚本 使用bash命令编写脚本实现 #!/bin/bashfunction …

linux下实现电脑开机后软件自启动

实现linux的软件自启动,需要四个文件 第一个【displayScreen.desktop】文件,.desktop文件就是一个用来运行程序的快捷方式,也叫启动器,常用来自启动用的文件,内容如下 [Desktop Entry] #要执行的脚本位置 Exec/home/yicaobao/te…