面试经典150题——逆波兰表达式求值

Man cannot live like a beast, he should pursue knowledge and virtue. -- Dante

green mountain across body of water

1. 题目描述

image-20240305092301126

2.  题目分析与解析

2.1 思路一

这个波兰式我记得在之前上编译原理的时候学过,是对输入的代码进行解析用的。可能有一部分读者对于波兰表达式并不太熟悉,我按照题目给的一个例子来解释一下:

image-20240305092736812

比如对于上述测试用例,遍历tokens,发现2,说明它是一个操作数,继续向后走,发现1,说明是另一个操作数,然后发现 +,说明此时需要进行 2+1的操作,这个结果 =3,它又相当于一个操作数。

继续向后,发现3,当作第二个操作数,然后发现 *,进行运算,将结果又当作一个操作数。但是因为已经没有后续运算了,所以 3*3=9,9就是结果输出。

其实经过一个测试用例,应该就能很快想到使用栈来解决。因为每发现一个运算符号,就说明就要对前面的操作数进行运算了,就相当于入栈时发现入栈的元素是运算符号,就弹出两个运算数进行运算,并将新的运算结果放入栈作为一个新的运算数。

当然题目提示了:

image-20240305093304209

如果没有提示该内容,我们还需要考虑各种运算优先符,比如:(),[],{},对于这种情况就需要对左右括号进行匹配,然后取出内部内容进行运算,我们这里就不考虑了。

代码思路

  1. 定义一个栈,用来存储运算

  2. 遍历tokens

    • 当发现当前入栈元素为数字,就入栈

    • 当发现当前入栈元素是操作符,就取出两个栈中的操作数进行运算,并将运算结果放入栈

  3. 遍历结束,栈顶元素就是结果

虽然能accept,但是效果并不好

image-20240305094158759

(最后看了下官方,发现思路没什么问题,但是在判断是否为数字的过程我本来使用的是正则表达式:

tokens[i].matches("-?\\d+")

获得上述效果,但是官方用的是:

image-20240305103040462

因为这个原因导致了判定是否数字可能效率很低,如果上述思路也使用isNumber能获得如下结果:

image-20240305103025529

)

2.2 思路二

下面一种方法是对于栈空间的优化,引自力扣官方,可以看看:

image-20240305103501317

recording

后面3.2贴上带解析的代码。

3. 代码实现

3.1 思路一

image-20240305094226437

3.2 思路二

image-20240305105746437

image-20240305105646018

4. 相关复杂度分析

分析时间复杂度:

  1. evalRPN方法:

    • 时间复杂度:O(n),其中 n 为 tokens 数组的长度。因为需要遍历 tokens 数组,对于每个元素进行入栈、出栈或运算操作,都是常数时间复杂度的操作。

  2. evalRPN方法(使用isNumber):

    • 时间复杂度:同样是 O(n),因为整体操作与 evalRPN 方法相同,只是在判断是否为数字时,使用了自定义的 isNumber 方法,但这并不改变时间复杂度。

  3. evalRPN3方法:

    • 时间复杂度:同样是 O(n),因为整体操作与 evalRPN 方法相似,但是使用了数组模拟栈,数组的大小为 (n + 1) / 2,而且每个元素只入栈或出栈一次,所以时间复杂度与 evalRPN 方法相同,都是线性时间复杂度。

分析空间复杂度:

  1. evalRPN方法:

    • 空间复杂度:O(n),主要是由栈的空间消耗决定的,栈的最大空间不超过 n/2 + 1,但因为其他常数因素,可以简化为 O(n)。

  2. evalRPN方法(使用isNumber):

    • 空间复杂度:与 evalRPN 方法相同,仍然是 O(n)。

  3. evalRPN3方法:

    • 空间复杂度:这里使用数组模拟栈,数组的大小为 (n + 1) / 2,因此空间复杂度为 O(n)。

综上所述,三种方法的时间复杂度都是 O(n),空间复杂度也都是 O(n),其中 n 为 tokens 数组的长度。

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

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

相关文章

对接华泰极速行情丨DolphinDB INSIGHT 插件使用教程

INSIGHT 是华泰证券依托大数据存储、实时分析等领域的技术积累,整合接入国内多家交易所高频行情数据,为投资者提供集行情接入、推送、回测、计算及分析等功能于一体的行情数据服务解决方案。基于 INSIGHT 官方提供的行情数据服务 C SDK(TCP 版…

【FastChat】用于训练、服务和评估大型语言模型的开放平台

FastChat 用于训练、服务和评估大型语言模型的开放平台。发布 Vicuna 和 Chatbot Arena 的存储库。 隆重推出 Vicuna,一款令人印象深刻的开源聊天机器人 GPT-4! 🚀 根据 GPT-4 的评估,Vicuna 达到了 ChatGPT/Bard 90%* 的质量&…

最短路径Floyd算法

第一题&#xff1a;[USACO08OPEN] Clear And Present Danger S #include<bits/stdc.h> using namespace std; int n,m; int g[105][105]; int arr[100005]; long long sum; int main() {scanf("%d%d",&n,&m);for(int i1;i<m;i){scanf("%d"…

聚观早报 | 2024款腾势D9将发布;岚图汽车2月销量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月2日消息 2024款腾势D9将发布 岚图汽车2月销量 苹果Vision Pro防汗新专利 真我12 Pro正式开售 Redmi K70/Pro…

终极排序(快排,归并,库函数)

一、快速排序 1、确定分界点&#xff1a;q [ l ] , q [ ( l r ) / 2 ] , q [ r ] ,或者其它区间之中的随机数。&#xff08;左 l 右 r &#xff09; 2、调整区间&#xff1a;&#xff08;较难理解的部分&#xff09; &#xff08;1&#xff09;、暴力做法 …

Linux 学习笔记(12)

十二、 系统服务 1 、系统服务分类&#xff0c;根据其使用的方法来分&#xff0c;可以被分为三类 a、由 init 控制的服务&#xff1a;基本都是系统级别的服务&#xff0c;运行级别这一章讲的就是这一类的服务 b、由 System V 启动脚本启动的服务&#xff1a;和我们打交道最多…

爬虫入门到精通_实战篇10(使用Redis+Flask维护动态代理池)

1 目标 为什么要用代理池 许多网站有专门的反爬虫措施&#xff0c;可能遇到封IP等问题。互联网上公开了大量免费代理&#xff0c;利用好资源。通过定时的检测维护同样可以得到多个可用代理。 代理池的要求 多站抓取&#xff0c;异步检测定时筛选&#xff0c;持续更新提供接…

Linux系统部署Discuz论坛并发布至公网随时随地可远程访问

目录 ​编辑 前言 1.安装基础环境 2.一键部署Discuz 3.安装cpolar工具 4.配置域名访问Discuz 5.固定域名公网地址 6.配置Discuz论坛 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux系统部署Discuz论坛并发布至公网随时随地…

基于Golang客户端实现Nacos服务注册发现和配置管理

基于Golang客户端实现Nacos服务注册发现和配置管理 背景 最近需要把Golang实现的一个web项目集成到基于Spring Cloud Alibaba的微服务体系中&#xff0c;走Spring Cloud Gateway网关路由实现统一的鉴权入口。 软件版本 组件名称组件版本Nacos2.2.0Go1.21.0Ginv1.9.1Nacos-s…

《汇编语言》- 读书笔记 - 第16章-直接定址表

《汇编语言》- 读书笔记 - 第16章-直接定址表 16.1 描述了单元长度的标号&#xff08;数据标号&#xff09;检测点 16.1 16.2 在其他段中使用数据标号assume通过标号取地址检测点 16.2 16.3 直接定址表&#xff08;Direct Addressing Table&#xff09;例1分析代码效果 例2分析…

代购集运公司需要什么样的信息化技术服务|集运系统对接主流电商API接口以实现客户丰富的代购体验

代购集运公司可以考虑以下信息化服务&#xff1a; 1、网络平台 代购集运公司可以建立一个在线平台&#xff0c;让客户能够浏览商品、下单、查询订单状态等操作。 平台也可以提供在线支付和快递跟踪等功能&#xff0c;方便客户和公司的沟通和交流。接入主流电商平台API接口&am…

应用在智能空调触摸屏中的高精度触摸芯片

智能空调是具有自动调节功能的空调。智能空调系统能根据外界气候条件&#xff0c;按照预先设定的指标对温度、湿度、空气清洁度传感器所传来的信号进行分析、判断、及时自动打开制冷、加热、去湿及空气净化等功能的空调。适合放在卧室&#xff0c;客厅等地方。 在中央控制系统…

中国电子学会2021年3月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.运行如下图所示的程序后&#xff0c;以下描述正确的是&#xff1f; A&#xff1a;角色停留在&#xff08;0,0&#xff09;的位置&#xff0c;不会移动。 B&#xff1a;角色会在舞台上沿水平方向不停地左右往返移动&#xff0c;碰到边缘就反弹。 C&#xff1a…

k8s部署mysql

&#xff08;作者&#xff1a;陈玓玏&#xff09; 一、前置条件 已部署k8s&#xff0c;服务端版本为1.21.14 二、部署mysql 拉取镜像&#xff1b; docker pull mysql将账号密码等信息写到configmap&#xff0c;创建configmap&#xff1b; apiVersion: v1 kind: ConfigM…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

贪心算法练习题(最小化战斗力差距、谈判、纪念品分组、分糖果)

目录 一、贪心算法的介绍 二、贪心算法的实现步骤 三、最小化战斗力差距 四、谈判 五、纪念品分组 六、分糖果 一、贪心算法的介绍 贪心的基本原理:每一步都选择局部最优解&#xff0c;而尽量不考虑对后续的影响&#xff0c;最终达到全局最优解。 贪心的局限性:贪心算法…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

自定义镜像上传阿里云

目录 前言 一、Alpine简介 二、Alpine 制作jdk镜像 2.1 jdkv2.0版本 2.2 jdkv3.0版本 三、镜像上传阿里云及下载 前言 上篇博主已经讲解过了自定义镜像&#xff0c;跟上篇文章我们继续衍生自定义镜像https://blog.csdn.net/2302_76638140/article/details/136352907 一…

CUDA学习笔记02:测试程序hello world

参考资料 Win10下在VS2019中配置使用CUDA进行加速的C项目 &#xff08;配置.h文件&#xff0c;.dll以及.lib文件等&#xff09;_vs2019 cuda-CSDN博客 配置流程 1. 新建一个一般的项目 2. 项目建好后&#xff0c;在项目里添加.cu测试文件 测试的.cu文件命名为cuda_utils.cu&…

MySQL——性能调优

性能调优&#xff08;重要&#xff09; SQL 优化的目的 减少磁盘 IO&#xff1a;尽可能避免全表扫描、尽量使用索引、尽量使用覆盖索引减少回表操作减少 CPU 和内存的消耗&#xff0c;尽可能减少排序、分组、去重之类的操作&#xff0c;尽量减少事务持有锁的时间 优化途径&…