面试经典150题——基本计算器

news2025/1/26 15:31:58

​A husband is a man of many miles.

——Unknown

gray and brown rock formation and mountain near body of water

1. 题目描述

image-20240306095156639

2.  题目分析与解析

2.1 思路一——先算括号内的内容

这个题目其实就是编译原理中很小的一个模块了,基本思路还是通过栈来实现。题目的难点主要在:

image-20240306095528042

其中括号优先级的处理,以及:

image-20240306095616122

这两个特殊要求的处理。以及:

image-20240306101401263

说明对于连续的字符串中的数字,我们应该把它当成一个数。

首先对于基本操作,跟上篇文章讲的一样(面试经典150题——逆波兰表达式求值),根据栈的特点进行运算。只不过对于 和 ()需要进行额外处理。

对于空格,当然没必要加入栈,因为没什么操作,而如果碰见了 (),那么如果是左括号 (就入栈,因为我们的括号计算是需要右括号 )来界定截至位置的,所以在左括号之后仍然继续入栈。

当碰见 ),不断出栈,直到碰见左括号,此时这一串内容就是需要计算的部分。

但是如果我们只使用一个栈来计算,就会出现一些难题:因为在上一篇内容中我们讲到计算是在入栈过程中判断当前字符是不是操作符来决定是否计算,但是此时因为有运算优先符,导致之前的内容已经在栈中,如果要计算需要先弹栈,所以就需要一个额外的栈作为每一个括号内部内容的计算临时栈。如下:

比如对于测试用例:

image-20240306104057640

开始我们需要一直入栈直到出现下图情况:

image-20240306104254078

此时发现右括号表示需要计算这一对括号中的内容,也就是(4+5+2):

image-20240306104336065

那么我们就需要先把绿色部分弹栈,然后再按照上一篇文章讲的那样进行计算,得到结果11,入栈得到下述情况:

image-20240306104530632

然后继续向后,此时又发现右括号:

image-20240306104653512

继续按照上述操作进行计算,先弹栈到左括号,然后计算括号内部的内容,也就是在用一个栈计算,计算完毕再把结果放入这个栈中,得到如下:

image-20240306104816947

再进行后续运算:

image-20240306112242445

最后在所有内容计算完毕后,栈顶就是最终结果。

2.2 思路二——使用两个栈(操作数与运算符)

上面的思路一其实在一些更复杂的情况下比如出现了乘法除法或者大括号,处理起来会非常复杂,是因为对于不同优先运算的处理导致了我们初始定义的栈需要不断吐出数据然后计算又放回。而造成这个现象的本质原因是因为这些操作符我们放在了原始栈中,如果我们要计算就得从原始栈弹栈,那我们可不可以把操作符放在另一个栈中,操作数放在一个栈中,通过两个栈,同时在出现加减法时直接就进行运算(直到遇到左括号或者栈为空),就可以避免不断的弹栈的过程。比如还是对于这个测试用例:

image-20240306113301572

在开始时,不断入栈,也要判断当前符号如果时加减法时,前面的已经计算过的内容是否能够计算,如果可以计算就需要先计算,因为这样可以避免数字的堆积,比如对于如下图的情况:

image-20240306141723024

这时发现当前(黄色)为加/减运算,就要判定前面的内容是否可以计算,因为此时表达式为 (1+(4+5,我们就先要把左括号后面的 4+5先计算结果,然后将计算结果入栈操作数栈,当前运算符入栈运算符栈,得到如下:

image-20240306142534277

然后遍历下一个字符,为2,出现下述情况:

image-20240306142829557

继续向后,发现右括号,那么就不断弹栈计算直到操作符栈栈顶为 (。其余操作基本类似。

但是还有一个注意的点,就是题目中说到了可能出现单元运算,对于这种情况,一种很巧妙的思想就是将单元运算转化为双元运算,比如对于 -1,可以转化为 0 - 1,对于 -(3 + 2)可以转化为 0 - (3 + 2)

所以记住在编程过程中如果发现当前符号位 +/-,要去判断当前位置的前一个字符,如果是 (,-,+,说明这是一个单元运算,在将操作符加入栈之前还需要把操作数中先加入一个0,实现一元运算到二元运算的转换。

具体步骤在代码中有注释。

2.3 思路三

官方题解,这个题解利用了我们小学都学过的计算方式

  • 比如对于1+(2+3),我们都知道等价于1+2+3

  • 对于1-(2+3),我们都知道等价于1-2-3

  • 也就是说对于括号前面是 +/-,我们分别要对应对括号内部的内容进行 不反转/反转

官方的题解就是利用了这种性质,通过一个标记位,标记当前括号内部的符号应不应该反转。

image-20240306145538110

没看懂没关系,我会在代码中进行详细注释。

3. 代码实现

3.1 思路一

image-20240306143804154

image-20240306143816726

3.2 思路二

image-20240306143638311

image-20240306143631063

3.3 思路三

image-20240306152938170

image-20240306152105342

4. 相关复杂度分析

方法 1(calculate

  • 时间复杂度:O(n),其中 n 是字符串的长度。字符串被遍历一次,每个字符最多进出栈一次。

  • 空间复杂度:O(n)。使用了两个栈来存储字符和临时结果,最坏情况下,当所有字符都是数字或括号时,栈的大小可以增加到 O(n)。

方法 2(calculate2

  • 时间复杂度:O(n)。与方法 1 类似,字符串被遍历一次,每个字符最多进出栈一次。

  • 空间复杂度:O(n)。这里有两个栈:一个用于数字,一个用于操作符。在最坏的情况下,操作符和数字可能全部被存储在栈中,所以空间复杂度是 O(n)。

方法 3(calculate3

  • 时间复杂度:O(n)。字符串仍然只遍历一次。

  • 空间复杂度:O(n)。虽然只有一个操作符栈 ops 和一个用于迭代的 sign 变量,但是在最坏情况下,当所有括号都嵌套时,栈的大小会与括号的数量成线性关系,因此空间复杂度为 O(n)。

在所有四种方法中,虽然时间复杂度都是 O(n),因为都是通过一次遍历来处理字符串,但是在实际的性能表现上可能会有细微的差别,这取决于栈操作和函数调用的开销。同样,尽管空间复杂度都是 O(n),不同方法中栈的实际大小也可能略有差异。例如,方法 3 最为节省空间,因为它仅仅使用了一个栈来追踪括号内部的正负号

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

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

相关文章

Spring揭秘:ImportBeanDefinitionRegistrar应用场景及实现原理!

内容概念 ImportBeanDefinitionRegistrar接口提供了强大的动态注册Bean的能力,它允许开发者在Spring容器初始化时,灵活地根据特定条件或需求来添加或修改Bean定义,从而实现更为精细的控制和扩展性。这是构建可扩展框架、插件系统或处理复杂配…

请说说你对Vue模板编译的理解

Vue模板编译是Vue.js框架的核心之一,它负责将Vue模板转换成渲染函数,从而实现模板的解析和渲染。要深入了解Vue模板编译,我们需要从编译过程、作用、特点等方面进行详细解析。 1. Vue模板编译的作用 Vue模板编译的主要作用是将Vue模板字符串…

021—pandas 书单整理将同一种书整理在一起

前言 在办公自动化场景下,最常见的需求就是信息的整理,pandas 最擅长复杂数据逻辑的处理,能够让整理工作更加高效,同时不容易出错。今天的案例是将一个平铺的书单按品类进行整理,合并为一行。 需求: 将书按书名进行合…

【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1:【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程!全套200集!学不会退出IT界! 参考文章2:清华教授大力打造的Python高级核心技术!整整100集,强烈建议学习(Python3…

基于springboot的母婴商城

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本母婴商城系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

Windows10安装Docker

使用 PowerShell 启用 Hyper-V 以管理员身份打开 PowerShell 控制台。 运行以下命令: PowerShell复制 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All如果无法找到此命令,请确保你以管理员身份运行 PowerShell。 安装…

Claude3深夜震撼发布!模型特点分析,附使用教程

Claude3深夜震撼发布!模型特点分析,附使用教程 引言 最新发布的Claude3引起了广泛关注,这次发布一举推出了三个不同类型的模型,分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。每个模型都具有独特的特点和能力&#xff…

Objective-C blocks 概要

1.block的使用 1.1什么是block? Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块,封装了函数调用及调用…

代码随想录算法训练营Day38 || leetCode 7509. 斐波那契数 || 70. 爬楼梯 || 746. 使用最小花费爬楼梯

动态规划和我们数电中学习的时序电路类似,某一时刻的状态不仅与当前时刻的输入有关,还与之前的状态有关,所以推导过程中我们需要模拟题目中的情况,来找到每一时刻状态间的关系。 做题思路如下 509. 斐波那契数 此题简单 状态方程…

【QT】创建第一个QT程序

下面的前7个可以先不看,直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分:应用程序类,窗口类应用程序类个数:有且只有一个QApplication a;如何查看类对应的模块:光标移动到类上,F1qmake模块的名字 2. …

Java开发从零开始,mysql面试题索引

前言 “金九银十”的秋招热潮已经开始了,经过7月8月这两个月的提前批,终于成功拿下了一些大厂的offer。小编经过这么多次的面试,这两天整理了一份面试清单分享给大家,希望能给大家一点帮助(java方向),觉得有帮助的同学…

3分钟带你搞定电流采样电阻选型

大家好,我是砖一。 一,电流采样电阻的介绍 电流检测电路常用于高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流检测等场景。 比如,对于电机来说,电流检测电路是为了检测电流功能有比…

ssm基于javaEE+springboot校园闲置二手物品拍卖交易平台_ngad7

为提升浏览用户观感及使用体验,本系统要具有易用性和美观性。通过页面的简单提示就可完成操作,校园闲置物品交易平台展示界面应该清楚简洁,使用户通过美观的前台页面能快速定位想要浏览的校园闲置物品交易平台信息。后台界面也应简约&#xf…

领腾讯云红包,可抵扣云服务器订单金额

在2024年腾讯云新春采购节优惠活动上,可以领取新年惊喜红包,打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口,如下图: 腾讯云2024新春采购节红包领取 如上图所示,点击“领”红包,每…

5G网络深度覆盖提升感知优化案例

随着5G业务的发展,用户感知尤为重要,随着人们的生活水平不断提高,对网络使用的要求也越来越高,用户感知更加重要,数据业务已超越语音业务成为流量和收入的主体,信号质量的决定作用更明显。5G TDD的频谱大带…

23蓝桥杯ACM培训-栈

前言&#xff1a; 回校第二天训练&#xff0c;今天的题目主要与stack有关。 正文&#xff1a; Problem:A 栈-程序员输入问题&#xff1a; #include<bits/stdc.h> using namespace std; int main(){stack<char> s1;stack<char> s2;string str;getline(cin,…

模仿Gitee实现站外链接跳转时进行确认

概述 如Gitee等网站&#xff0c;在有外部链接的时候如果不是同域则会出现一个确认页面。本文就带你看看这个功能应该如何实现。 效果 实现 1. 实现思路 将打开链接作为参数传递给一个中间页面&#xff0c;在页面加载的时候判断链接的域名和当前网站是否同域&#xff0c;同域…

贪心 Leetcode 763 划分字母区间

划分字母区间 Leetcode 763 学习记录自代码随想录 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返…

机器学习-面经(part7、无监督学习)

机器学习面经系列的其他部分如下所示&#xff1a; 机器学习-面经&#xff08;part1&#xff09; 机器学习-面经(part2)-交叉验证、超参数优化、评价指标等内容 机器学习-面经(part3)-正则化、特征工程面试问题与解答合集机器学习-面经(part4)-决策树共5000字的面试问题与解答…

C++ spfa求最短路 (可以带负权边)SPFA算法

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 impossible。 数据保证不存在负权回路。 输入格式 第一行包含整数 n 和…