LeetCode - #150 逆波兰表达式求值

news/2024/12/4 17:52:13/

在这里插入图片描述
在这里插入图片描述

文章目录

    • 前言
    • 1. 描述
    • 2. 示例
    • 3. 答案
    • 关于我们

前言

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新到 150 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

1. 描述

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

2. 示例

示例 1

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

约束条件:

  • 1 <= tokens.length <= 10^4
  • tokens[i] 是一个算符("+""-""*""/"),或是在范围 [-200, 200] 内的一个整数

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

3. 答案

class EvaluateReversePolishNotation {func evalRPN(_ tokens: [String]) -> Int {var stack = [Int]()for token in tokens {if let num = Int(token) {stack.append(num)} else {guard let postNum = stack.popLast(), let prevNum = stack.popLast() else {fatalError("Invalid Input")}stack.append(operate(token, prevNum, postNum))}}if let last = stack.last {return last} else {fatalError("Invalid Input")}}private func operate(_ token: String, _ prevNum: Int, _ postNum: Int) -> Int {switch token {case "+":return prevNum + postNumcase "-":return prevNum - postNumcase "*":return prevNum * postNumcase "/":return prevNum / postNumdefault:fatalError("Invalid Input") }}
}
  • 主要思想:当遇到运算符时,将数字压入堆栈,并弹出2进行运算。
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

算法题解的仓库:LeetCode-Swift

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。


http://www.ppmy.cn/news/1552341.html

相关文章

论文mindfulness_PTSS_COVID19(八):总结

文章目录 介绍再次提醒:计算不同维度得分的规则参考介绍 本研究的数据分析原采用SPSS软件进行处理,而本教程则选择使用R语言来重新执行数据分析,以验证研究结果的可复现性。尽管在对表3(table3 @fig-index-table3 )、表4(table4 @fig-index-table4 )和表5(table5 @fig…

网络安全从入门到精通(第二章-3)后端基础SQL— MySQL高级查询与子查询

1&#xff0c;MySQL基础查询语句&#xff1a; select * from 表 order by ASC/DESC; ASC&#xff1a;从小到大&#xff08;默认&#xff09;。 DESC&#xff1a;从大到小。 补充&#xff1a;在不知道字段名称的情况下&#xff0c;order by可以使用数字代替&#xff0c;用数字…

LeetCode 每日一题 2024/11/25-2024/12/1

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 11/25 743. 网络延迟时间11/26 3206. 交替组 I11/27 3208. 交替组 II11/28 3250. 单调数组对的数目 I11/29 3251. 单调数组对的数目 II11/30 3232. 判断是否可以赢得数字游…

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了&#xff0c;回来感受一下&#xff0c;这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …

android视频播放器之DKVideoPlayer

一个老牌子的播放器了&#xff0c;项目可能已经有些日子没有维护了。但是使用效果还是不错的。支持多种视频格式&#xff0c;及重力感应、调节亮度等多种效果。想来想去&#xff0c;还是记录下来&#xff0c;我会在文章的最后注明github地址&#xff1a; 首先引入依赖&#xff…

【系统架构设计师】真题论文: 论软件开发过程 RUP 及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2018年 试题1)解题思路论文素材参考RUP 概念和特点RUP 的主要阶段真题题目(2018年 试题1) RUP (Rational Unified Process)是 IBM 公司一款软件开发过程产品,它提出了一整套以UML 为基础的开发准则,…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…

160-两路14位400Msps AD,两路16位400Msps DA FMC子卡模块

一、概述 该板卡可实现2路14bit 400Msps AD 和2路16bit 400Msps DA功能&#xff0c;遵循 VITA 57 标准&#xff0c;板卡可以直接与VME/VXS/AMC/VPX/PCI-E FPGA 载板连接使用&#xff0c;用于模拟信号、中频信号采集&#xff0c;信号发出等应用&#xff0c;是xilinx开发板设计…