面试经典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 数组的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样获得CNVD原创漏洞证书

1. 前言 因为工作变动,我最近把这一年多的工作挖漏洞的一些工作成果提交到了CNVD漏洞平台(https://www.cnvd.org.cn/),获得了多张CNVD原创漏洞证书。本篇博客讲下怎么获得CNVD原创漏洞证书,以供大家参考。 2. CNVD原创…

Python常用验证码标注和识别(需求分析和实现思路)

目录 一、需求分析 图像验证码识别: 文本验证码识别: 二、实现思路 三、案例与代码 四、总结与展望 在当今的数字时代,验证码(CAPTCHA)作为一种安全机制,广泛应用于网站和应用程序中,以防…

Anthropic官宣Claude3:建立大模型 推理、数学、编码和视觉等方面 新基准

文章目录 1. product2. Main2.1 核心能力2.2 打榜表现 3. My thoughtsReference Claude 3 在推理、数学、编码、多语言理解和视觉方面,全面超越GPT-4在内的所有大模型,重新树立大模型基准。 1. product https://claude.ai/ 国内暂不能使用,…

全球首个隐私计算一体机国际标准发布 蚂蚁摩斯参与编制

近日,IEEE 标准协会(IEEE-SA)正式发布并推行了全球首个隐私计算一体机国际标准《隐私计算一体机技术要求》(IEEE 3156-2023)。该标准由蚂蚁集团推动,中科院信息工程研究所、北京交通大学、中国信息通信研究…

7.1.2 Selenium的用法1

目录 1. 初始化浏览器对象和访问页面 2. 查找节点及节点交互 2.1 查找单个节点 (1)获取方法1——特定方法 (2)通用方法 2.2 查找多个节点 2.3 节点交互 3. 动作链 4. 执行 JavaScript 之下拉进度条 5. 获取节点信息 5.…

Ubuntu篇——crontab修改编辑器

输入命令: crontab -e 如果你的系统是第一次使用crontab服务,会首先让你选择一个编辑器 如果已经选择过编辑器,后续想要修改默认编辑器,可以输入sudo select-editor进行修改。

瑞芯微RK3588 C++部署Yolov8检测和分割模型

最近这一个月在研究国产瑞芯微板子上部署yolov8的检测和分割模型,踩了很多坑,记录一下部署的过程和遇到的一些问题: 1 环境搭建 需要的环境和代码主要包括: (1)rknn-toolkit2-1.5.2:工具链&am…

LibreOffice7.4安装

文件格式转换LibreOffice不失为一个好工具,从转换后的准确率、转换速度、转换格式的支持LibreOffice都是比较给力的。下面,让我们具体学习下如何安装和使用libreOffice。 官网信息: https://zh-cn.libreoffice.org/download/libreoffice/ 安…

【学习心得】响应数据加密的原理与逆向思路

一、什么是响应数据加密? 响应数据加密是常见的反爬手段的一种,它是指服务器返回的不是明文数据,而是加密后的数据。这种密文数据可以被JS解密进而渲染在浏览器中让人们看到。 它的原理和过程图如下: 二、响应数据加密的逆向思路 …

抓包工具获取请求信息

Charles 下载安装 下载 官方下载地址:https://www.charlesproxy.com/latest-release/download.do 下载后傻瓜式安装就好,这个官方的需要激活,可以选择绿色版或者学习版 绿色版 绿色中文版:https://soft.kxdw.com/pc/Charles.z…

05. Nginx入门-Nginx访问控制

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…

2024最新AI大模型产品汇总

文章目录 1. 写在前面2. 效率工具3. 聊天机器人4. 应用开发工具5. Prompt工具与社区6. 通用基础大模型7. 训练框架8. 开源数据集9. 推理与部署平台及工具 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致…

matlab 提取分割位于多边形区域边缘内部或边缘上的点

[in,on] = inpolygon(xq,yq,xv,yv) xv 和 yv 为定义的多边形区域的,如xv = [1 4 4 1 1 ];yv = [1 1 4 4 1 ];注意最后一个数字与第一个重复,保证多边形闭合; xq 和 yq 为待查询的点in:在多边形内部和边缘的点序号on:仅在多边形边缘的点序号 提取分割方法: matrix=[xq yq…

JXLS导出复杂的Excel表格

前言 官方文档: https://jxls.sourceforge.net/getting-started.html JXLS是一个用于生成Excel文档的Java库。它提供了一种基于模板的方式来生成Excel文档,使得开发者可以在模板中定义样式、公式和数据绑定等内容,然后通过填充数据来生成最终的Excel文…

雍禾植发聚焦医学和美学,雍禾医疗“好医生·一人一案”引领时代

从“秃头大叔”到“秃头少女”,从病理性脱发治疗到美学性毛发诊疗,Z世代下更精细的毛发医疗需求为整个行业带来了重要增量。更多发友意识到毛发的生长和外观对于形象塑造的重要性,并开始寄望通过毛发诊疗来进一步提升个人形象,这一…

【Pytorch 第四讲】图像分类的Tricks

1. 标签平滑 在分类问题中,最后一层一般是全连接层,然后对应标签的one-hot编码,即把对应类别的值编码为1,其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题。这种方式会鼓励模型对不同…

【01】openEuler 源码安装 PostgreSQL

openEuler 源码安装 PostgreSQL 部署环境说明Shell 前端软件包管理器基础概念YUM 简介DNF 简介 源码安装 PostgreSQL环境变量(env)设置临时环境变量设置永久环境变量设置 初始化数据库(initdb) 数据库基本操作数据库基本配置&…

Leetcode 26. 删除有序数组中的重复项 java版。 java解决删除重复数组元素并输出长度

1. 官网链接: . - 力扣(LeetCode) 2. 题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该…

JavaScript实现将输入框内容放大的效果

问题描述&#xff1a;利用DOM所学知识&#xff0c;实现在输入框内输入内容时&#xff0c;在输入框上方显示一个将文字放大的框&#xff0c;在不输入内容时&#xff0c;这个框是被隐藏的。 关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

第三篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas股票市场数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas进行股票市场数据分析常见步骤和示例代码1. 加载数据2. 数据清洗和准备3. 分析股票价格和交易量4. 财务数据分析 二、扩展思路介绍1. 技术指标分析2. 波动性分析3. 相关性分析4.…