力扣刷题日记之150.逆波兰表达式求值

今天继续给大家分享一道力扣的做题心得今天这道题目是 150.逆波兰表达式求值

题目如下,题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation


1,题目分析

        这道题说是一道中等难度的题目,其实如果理解了其中的含义,实际上比简单题还要稍微简单一些,废话不多说我们直接开始分析题目,

        这道题最核心的含义就是通过将这个String类型的数组中的数和运算符号按照其运算规则算完然后返回最后算出来的那个值就可以了,仔细看这个运算规则是不是很像是在栈里面运行一样?所有这道题最直接而且高效的办法就是利用栈来做,理解题目意思之后我们做题简直就是游刃有余

2,解题思路

下面是我的最初提交通过的代码大家可以参考一下

class Solution {public int evalRPN(String[] tokens) {int length = tokens.length;Stack<Integer> stack = new Stack<>();for(String token : tokens){int value1,value2;switch(token){case "+" :value1 = stack.pop();value2 = stack.pop();stack.push(value1 + value2);break;case "-" :value1 = stack.pop();value2 = stack.pop();stack.push(value2 - value1);break;case "*" :value1 = stack.pop();value2 = stack.pop();stack.push(value1 * value2);break;case "/" :value1 = stack.pop();value2 = stack.pop();stack.push(value2 / value1);break;default: stack.push(Integer.parseInt(token));break;}}return stack.peek();}
}

        具体解题思路就是通过一个for循环将题目所给的这个数组遍历,然后在循环中利用数组中只有运算数字和这个加减乘除这个5类元素的特点我们直接在里面写一个switch结构来进行判断,假如是运算符则弹出栈前面两项来进行对应的运算然后在将结果放入栈顶,假如不是运算符则将数字放入栈内,最后经过循环完毕之后,栈里面就只剩一个最后的结果的数字了这个时候直接返回栈顶元素就是题目的答案了

        注意:这个题目所给的数字和运算符都是数目相对的都是可以最后通过这个逆波兰表达式算出来的,也就是不会有数组第一或者第二个元素就是运算符的情况,所有这些特殊情况我们都不需要考虑因为这些情况是不满足这个题目的运算规则的

3,优化后的题解

        为了达到打败更多人所有优化了代码但是核心逻辑是不变的,只是优化了一下内容提升了运行效率

import java.util.ArrayDeque;
import java.util.Deque;class Solution {public int evalRPN(String[] tokens) {// 使用 ArrayDeque 替代 StackDeque<Integer> stack = new ArrayDeque<>(tokens.length);for (String token : tokens) {char firstChar = token.charAt(0);// 判断是否为运算符if (token.length() == 1 && (firstChar == '+' || firstChar == '-' || firstChar == '*' || firstChar == '/')) {int b = stack.pop(); // 注意 b 是后弹出的int a = stack.pop(); // a 是先弹出的if (firstChar == '+') stack.push(a + b);else if (firstChar == '-') stack.push(a - b);else if (firstChar == '*') stack.push(a * b);else stack.push(a / b);} else {// 将操作数压入栈stack.push(Integer.parseInt(token));}}// 返回最终计算结果return stack.pop();}public static void main(String[] args) {// 测试代码Solution solution = new Solution();// 示例测试数据String[] tokens1 = {"2", "1", "+", "3", "*"}; // (2 + 1) * 3 = 9String[] tokens2 = {"4", "13", "5", "/", "+"}; // 4 + (13 / 5) = 6String[] tokens3 = {"10", "6", "9", "3", "/", "-", "*", "17", "+", "5", "+"}; // 22System.out.println("Result 1: " + solution.evalRPN(tokens1)); // 输出 9System.out.println("Result 2: " + solution.evalRPN(tokens2)); // 输出 6System.out.println("Result 3: " + solution.evalRPN(tokens3)); // 输出 22}
}

代码优化要点

  1. ArrayDeque 替代 Stack

    • 提高栈操作效率。

    • 初始化时指定容量,避免频繁扩容

2,直接判断运算符

        利用 token.length() == 1char 比较,减少字符串操作开销。

        避免多次调用 equals()

3,运算符逻辑简化

        直接对字符进行匹配,减少冗余代码。        

4,避免重复操作

        操作数和运算符分开处理,尽量减少额外的判断和字符串转换。

4,总结

        感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!

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

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

相关文章

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …

如何知道表之间的关系(为了知识图谱的构建)

今天就简单点&#xff0c;把今天花时间做的一个程序说下。 我们在做常规知识图谱的时候&#xff0c;面临一个问题就是要知道关系是如何建立。如果表的数量比较少&#xff0c;人工来做还是比较容易的。 如果有非常多的表&#xff0c;并且这些表之间的关联关系都不清楚的情况下…

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索

题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识&#xff0c;实现简单的一个小案例&#xff0c;网易云音乐热…

消息中间件分类

消息中间件&#xff08;Message Middleware&#xff09;是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制&#xff0c;允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括&#xff1a; 1. JMS&#xff08;Java Message S…

GoogleCloud服务器的SSH连接配置

首先&#xff0c;Google的服务器默认是通过自带的SSH网页端连接的&#xff0c;比较麻烦和容易断开&#xff0c;不是很好用&#xff0c;常见的解决办法有两种一种是通过修改ssh的配置&#xff0c;添加密码的方式进行连接&#xff0c;一种是通过配置公钥进行连接。 密码连接之前有…

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大&#xff0c;采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

Neo4j Desktop 和 Neo4j Community Edition 区别

Neo4j Desktop 和 Neo4j Community Edition 的主要区别在于它们的用途、功能以及安装和管理方式。以下是这两者的详细对比&#xff1a; 1. Neo4j Desktop Neo4j Desktop 是一个图形化的桌面应用程序&#xff0c;主要为开发人员和个人使用提供了一个便捷的环境来安装、管理和运…

DAY120java审计第三方组件依赖库挖掘FastjsonShiroLog4jH2DB

组件漏洞判断插件 一、Tmall_demo-master&#xff08;fastjson&#xff09; 1、配置文件查找安装组件 1、JSON.parse(json) 2、JSON.parseObject 2、找可控的变量 3、利用组件漏洞 poc:propertyJson{"type":"java.net.Inet4Address","val":&q…

要查看你的系统是 x64(64位)还是 x86(32位),可以按照以下步骤操作

文章目录 1. 通过“系统信息”查看系统架构2. 通过“设置”查看系统架构3. 通过命令提示符查看系统架构4. 通过 PowerShell 查看系统架构5. 通过文件资源管理器查看系统架构总结 要查看你的系统是 x64&#xff08;64位&#xff09;还是 x86&#xff08;32位&#xff09;&…

通过JS删除当前域名中的全部COOKIE教程

有时候需要通过JS来控制一下网站的登录状态&#xff0c;就例如:网站登出功能&#xff0c;我们可以直接通过JS将所有COOKIE删除&#xff0c;COOKIE删除之后&#xff0c;网站自然也就退出了。 那么今天我就给大家分享一段JS的函数&#xff0c;通过调用这段函数就可以实现删除COO…

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2&#xff0c;发现在编写feat…

C++ 中的string类

本文主要通过文档形式使用C中string类的常见接口进行介绍&#xff0c;然后我们自己实现一个string类 标准库中的string 使用库中的string类时&#xff0c;必须包含头文件&#xff1a;#include<string>, 以及 using namespace std string 构造函数 首先我们来看构造函数…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

Python知识点精汇!字符串:定义、截取(索引)和其内置函数

目录 一、字符串的定义 二、字符串的截取 1.截取干啥的 2.怎么用截取 3.打印多次 4.两个字符串拼接在一起 三、字符串内置函数 1.查询函数&#xff1a; &#xff08;1&#xff09;find(str,start,end) &#xff08;2&#xff09;index&#xff08;str,start,end&#…

mindspore发布件

MindSpore Repohttps://repo.mindspore.cn/ MindSpore Repohttps://repo.mindspore.cn/mindspore-lab/mindnlp/newest/any/

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…