面试算法常考题之-------逆波兰式合集

news2024/11/26 2:34:47

逆波兰式背景介绍

逆波兰式是一种特殊的数学表达式表示法,它的诞生背景可以追溯到20世纪30年代。当时,波兰数学家Jan Wójtowicz和Wacław Sierpiński提出了一种新的数学表达式表示法,这种表示法将运算符放在操作数之后,而不是传统的数学表达式中的运算符放在操作数之前的表示法。 这种新的表示法被称为逆波兰式,因为它与传统的波兰式数学表达式相反。传统的波兰式数学表达式是一种将运算符放在操作数之前的表示法,例如(2+3)*4。而逆波兰式则是将运算符放在操作数之后,例如2 3 + 4 *。

逆波兰式的出现主要是为了解决传统的数学表达式中的一些问题,例如括号匹配问题。在传统的数学表达式中,括号的嵌套顺序非常重要,如果括号的嵌套顺序不正确,就会导致计算结果错误。而逆波兰式则避免了括号的嵌套问题,因为它不需要使用括号来表示运算顺序。 逆波兰式的出现对计算机科学产生了重要的影响,它被广泛应用于计算机程序设计中,特别是在函数式编程和函数式编译器中。逆波兰式也被用于一些高级编程语言中,例如Lisp和Scheme。


前缀式、后缀式、中缀式的概念

二叉树表达

一个表达式可以使用一棵二叉树来进行一个存储表达,而对应的前、中、后序遍历的结果对应的就是前缀式、中缀式、后缀式。

例如表达式**((a+b)/(cd)+p)-(cm)**

对应二叉树:

image.png

中缀式

中缀式就是我们人能够认识的表达式格式,如((a+b)/(cd)+p)-(cm),而对应的就是该二叉树的中序遍历得到的结果

前缀式

前缀式就是将该二叉树进行前序遍历得到的结果:-+/+abcdpem

后缀式

后缀式就是将该二叉树进行后序遍历得到的结果:ab+cd*/p+em*-

总结

从前中后序的结构其实不难得出一个很明显的结论:

前缀式往往会将运算符号放在前面,数字放在后面,而后缀式往往是将数字放在前面,运算符号放在后面。

波兰式常见面试算法题:

1.根据前缀式、后缀式求出表达式结果:

后缀式求值(leetcode地址:https://leetcode.cn/problems/8Zf90G/ )

题目简单描述:

根据[ 逆波兰表示法]求该后缀表达式的计算结果。

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


说明:

   整数除法只保留整数部分。
   给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。


示例 1:


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

其实这个题型是特别简单的,大概思路就是直接遍历tokens,遇见数字就将其放入栈中,遇见运算符将数字取出两个进行运算再将结果放入栈中…即便没遇见过也是很容易想出来的

Go代码展示:

func evalRPN(tokens []string) int {
    stack := []int{}
    for _, token := range tokens {
        val, err := strconv.Atoi(token)
        if err == nil {
            stack = append(stack, val)
        } else {
            num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
            stack = stack[:len(stack)-2]
            switch token {
            case "+":
                stack = append(stack, num1+num2)
            case "-":
                stack = append(stack, num1-num2)
            case "*":
                stack = append(stack, num1*num2)
            default:
                stack = append(stack, num1/num2)
            }
        }
    }
    return stack[0]
}

前缀式求值与其原理相同,建议自己可以尝试一下,不过leetcode没有类似题目

中缀式转前缀式、中缀式转后缀式

这种题型其实也挺常考的,之前面试字节一面就出了一个中缀式转后缀式的算法题。。

这类题就没这么容易了,因为有括号的原因,所以其实需要考虑的情况是比较多的。不过基本原理依旧是使用栈~

此题我依旧只解析中缀转后缀的例子,因为中缀转前缀原理依旧一致。

例如该中缀式((a+b)/(cd)+p)-(cm)

其基本原理依旧是遍历一遍中缀式,对’(‘、’)'、‘运算符’、'数字’都会有不同的处理方式

case 1’数字’:直接将其放入结果数组

case 2 ‘(’: 放入栈中

case 3 ‘)’:将其与对应左括号之间的符号出栈放入结果数组

case 4 ‘运算符’:若在栈底, 在括号底, 或者操作符优先级比栈顶的高, 则操作符入栈;否则出栈

举个例子:((a+b)/(cd)+p)-(cm) ---->ab+cd*/p+cm*-

'(' --> stack=['(']       res=[]
'(' --> stack['(' , '(']  res=[]
'a' --> stack['(' , '(']  res=['a']
'+' --> stack['(' , '(' , '+']  res=['a']
'b' --> stack['(' , '(' , '+']  res=['a','b']
')' --> stack['(']   res=['a','b','+']
'/' --> stack['(','/']   res=['a','b','+']
'(' --> stack['(','/','(']   res=['a','b','+']
'c' --> stack['(','/','(']   res=['a','b','+' , 'c']
'*' -->  stack['(','/','(' , '*']   res=['a','b','+' , 'c']
'd' -->  stack['(','/','(' , '*']   res=['a','b','+' , 'c' , 'd']
')' -->  stack['(','/']   res=['a','b','+' , 'c' , 'd','*']
'+' -->  stack['(','+']   res=['a','b','+' , 'c' , 'd','*','/']
'p' -->  stack['(','+']   res=['a','b','+' , 'c' , 'd','*','/','p']
')' -->  stack[]   res=['a','b','+' , 'c' , 'd','*','/','p','+']
'-' -->  stack['-']   res=['a','b','+' , 'c' , 'd','*','/','p','+']
'(' -->  stack['-','(']   res=['a','b','+' , 'c' , 'd','*','/','p','+']
'c' -->  stack['-','(']   res=['a','b','+' , 'c' , 'd','*','/','p','+','c']
 '*' -->  stack['-','(','*']   res=['a','b','+' , 'c' , 'd','*','/','p','+','c']
 'm' -->  stack['-','(','*']   res=['a','b','+' , 'c' , 'd','*','/','p','+','c',''m']
 ')' --> stack[]   res=['a','b','+' , 'c' , 'd','*','/','p','+','c',''m','*','-']

每一步按照上述原理进行,就很容易理解如何将中缀式转为后缀式了。而转前缀式同理,感兴趣的小伙伴可以自行去推导一下步骤~


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

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

相关文章

Stable Diffusion webui 源码调试(二)

Stable Diffusion webui 源码调试(二) 个人模型主页:LibLibai stable-diffusion-webui 版本:v1.4.1 内容更新随机,看心情调试代码~ 分析StableDiffusionProcessingTxt2Img类中的sample函数 Sampler /work/stable-d…

xxx升学助考网登录参数跟栈分析

逆向参数分析: 思路: ​ 如果参数出现的次数比较少,完全可以使用全局搜索 ​ 如果参数出现比较多,建议使用跟栈 网站: 下面运行结果 import base64 # 解密 result base64.b64decode(aHR0cHM6Ly93ZWIuZXd0MzYwLm…

【经验模态分解】3.EMD模态分解算法设计与准备工作

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file EMD模态分解算法设计与准备工作* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软…

Day25力扣打卡

打卡记录 寻找旋转排序数组中的最小值(二分) 链接 由于是旋转排序数组,所以整个数组有两部分是递增的,选取右侧最后元素,即可将整个数组分为大于该元素和小于该元素,碰头地段即为最小值。 class Solutio…

Effective C++ 系列和 C++ Core Guidelines 如何选择?

Effective C 系列和 C Core Guidelines 如何选择? 如果一定要二选一,我会选择C Core Guidelines。因为它是开源的,有300多个贡献者,而且还在不断更新,意味着它归纳总结了最新的C实践经验。最近很多小伙伴找我&#xff…

系列二、Shiro的核心组件

一、核心组件 # 1、UsernamePasswordToken 封装了用户的登录信息,使用用户的登录信息来创建Token # 2、SecurityManager Shiro的核心组件,负责安全认证和授权 # 3、Subject Shiro的一个抽象概念,包含了用户信息 # 4、Realm 开发者自定义的模块…

AcWing99. 激光炸弹

题目 地图上有 N N N 个目标,用整数 X i , Y i X_i,Y_i Xi​,Yi​ 表示目标在地图上的位置,每个目标都有一个价值 W i W_i Wi​。 注意:不同目标可能在同一位置。 现在有一种新型的激光炸弹,可以摧毁一个包含 R R RR RR 个…

SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解

SpringBoot 自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作 思考:SpringBoot是如何知道要创建哪个Bean的?比如SpringBoot是如何知道要创建RedisTemplate的?…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language,翻译为超文本标签语言,标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一,也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

在Rust中使用多线程并发运行代码

1.Rust线程实现理念 在大部分现代操作系统中,已执行程序的代码在一个 进程(process)中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程&am…

【js逆向实战】某sakura动漫视频逆向

写在前面 再写一个逆向实战,后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站,大多数视频网站走的是M3U8协议,就是一个分段传输,其实这里就有两个分支。 通过传统的m3u8协议,我们可以直接进行分…

千万别对女项目经理抱有幻想

大家好,我是老原。 前段时间,有一个粉丝朋友来咨询我一个问题,多少是有点把老原我问蒙圈 现在职场上女PM并不少见,也有很多优秀的女PM。 我也有不少和女PM合作的经历,不得不说,和她们沟通/合作可以说是很…

详解卷积神经网络结构

前言 卷积神经网络是以卷积层为主的深度网路结构,网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积(元素相乘再求和)的操作。 1. 卷积层 常见的卷积操作如下: 卷积操作解释图解…

能谈一下 CAS 机制吗

(本文摘自mic老师面试文档) 一个小伙伴私信我,他说遇到了一个关于 CAS 机制的问题,他以为面试官问的是 CAS 实现单点登录。 心想,这个问题我熟啊,然后就按照单点登录的思路去回答,结果面试官一…

Azure - 机器学习:自动化机器学习中计算机视觉任务的超参数

Azure Machine Learning借助对计算机视觉任务的支持,可以控制模型算法和扫描超参数。 这些模型算法和超参数将作为参数空间传入以进行扫描。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济…

美国Embarcadero公司正式发布2023 RAD Studio Delphi C++ Builder 12 Athens

Embarcadero 非常高兴地宣布发布 RAD Studio 12 Athens 以及 Delphi 12 和 CBuilder 12。RAD Studio 12 Athens 版本包含令人兴奋的新功能,为该产品的未来奠定了基础。 目录 主要新功能 C 的奇妙之处Delphi 的一些不错的补充FireMonkey 和 Skia 作为新基金会采用 MD…

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则…

从浏览器输入一个URL到最终展示出页面,中间会发送哪些事儿?

文章目录 前言一. DNS域名解析二. 进行封装三. 进行传输四. 到达服务器后层层分用五. 服务器把响应数据重新封装六. 响应数据进行传输七. 到达客户端层层分用八. 将网页渲染到浏览器上 前言 当你输入一个网址:www.baidu.com时,浏览器究竟做了哪些工作才…

C++ Qt 学习(四):自定义控件与 qss 应用

1. qss 简介 Qt style sheet(qss,Qt 样式表),不需要用 C 代码控件进行重载,就可以修改控件外观,类似于前端的 css 2. qss 选择器 2.1 通配符选择器 /* 设置后控件窗口背景色都被修改为黄色 */ * {backg…

如何在Android平板上远程连接Ubuntu服务器code-server进行代码开发?

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以,这里以VMwhere ubuntu系统为例 下载code serve…