算法通关村第四关-黄金挑战基础计算器问题

大家好我是苏麟 , 今天带来栈的比较难的问题 .

计算器问题

基础计算器 LeetCode 224

描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
  • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

题目 :

LeetCode 224.基本计算器 : 

224. 基本计算器

分析 : 

计算器也是非常常见的问题,解决运算器问题,最好的工具就是栈。我们需要两个变量来记录符号和运算后的值 , 因为题目中只有 + - ( ) 和空格 , 所以我们遇到空格就跳过 , 遇到就把符号位变为1 , 遇到减号就把符号位变为 -1 , 遇到 ( 就把计算的值和符号放到栈里 , 遇到 ) 就把栈中的值和符号取出来和当前的数字相加 , 遇到数字就进行操作 ... ... 

当然这里说可能不太好理解 , 下面有个视频大家可以更好的理解这个思路 .

视频连接 : 基础计算器

解析 :

这个代码写的不是很华丽 , 但是是这个意思 ...

//LeetCode
class Solution {public int calculate(String s) {//0 + (1+(4+5+2)-3)+(6+8)Stack<Integer> stack = new Stack<>();int nums = 0;int flag = 1;int temp = 0;int n = 0;while( n < s.length()){char c = s.charAt(n);int d = c - '0';if(c == ' '){n++;}else if(c == '+'){flag = 1;n++;}else if(c == '-'){flag = -1;n++;}else if(c == '('){stack.push(nums);stack.push(flag);nums = 0;flag = 1;n++;}else if(c == ')'){int preFlag = stack.pop();int preNums = stack.pop();nums = nums * preFlag + preNums;n++;}else{temp = c - '0';n++;while(n < s.length() && s.charAt(n) >= '0' && s.charAt(n) <= '9'){char r = s.charAt(n);temp = 10 * temp +  (r - '0');n++;}nums = nums + temp * flag;}}return nums;}
}

基础计算器 LeetCode 227

描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

题目 :

LeetCode 227.基础计算器

227. 基本计算器 II

分析 :

解决运算器问题,最好的工具就是栈。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。

对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果具体来说,遍历字符串 ss,并用变量flag 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据 flag 来决定计算方式 加号: 将数字压入栈,减号: 将数字的相反数压入栈,乘除号: 计算数字与栈顶元素,并将栈顶元素替换为计算结果。代码实现中,若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新 flag  为当前遍历的字符遍历完字符串 ss 后,将栈中元素累加,即为该字符串表达式的值。

Character.isDigit() 这个函数是判断字符是否由数字组成

举例 : 2 * 5  s="2 * 5" s的长度=5

第一步 : num = 0 , flag = '+' , 遍历 i = 0 因为是数字所以 : num = 2 

第二步 :  遍历 i = 1 , ' ' 不会进入循环

第三部 : 遍历 i = 2 , * 是乘号 所以进入到第二个分支里 , 因为默认的flag = '+' , 所以把2放到栈里 , 把符号flag = * , num = 0

第四步 : 遍历 i = 3 , ' ' 不会进入分支

第五步 : 遍历 i = 4  , num = 5 并且 i = n 所以进入第二个分支 , flag = * , 所以取出 2 * num = 2 * 5 = 10 , 把10放到栈里

解析 :

class Solution {public int calculate(String s) {Stack<Integer> stack = new Stack<>();char flag = '+';int num = 0;int n = s.length() - 1;for(int i =0 ; i <= n ; i++){if(Character.isDigit(s.charAt(i))){num = num * 10 + (s.charAt(i) - '0');}if(!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n ){switch(flag){case '+' :stack.push(num);break;case '-' :stack.push(-1 * num);  break;case '*' :stack.push(stack.pop() * num);break;default :stack.push(stack.pop() / num);}flag = s.charAt(i);num = 0;}}int val = 0;while(!stack.isEmpty()){val += stack.pop();}return val;}
}

这关就到这里 , 下一关见!

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

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

相关文章

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量&#xff0c;消除噪声和错误&#xff0c;从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响&#xff0c;导致误导性的结论和决策。因此&…

C++类和对象下(初始化列表,静态成员,explicit关键字,友元)

C类和对象下[初始化列表,静态成员,explicit关键字,友元] 一.初始化列表1.为什么会有初始化列表2.初始化列表的语法形式3.没有默认构造函数的自定义成员变量4.初始化列表是成员变量定义的地方5.初始化列表可以跟函数体内定义搭配使用6.初始化列表执行的顺序7.总结建议 二.静态成…

当风格遇上浴缸:浴室装饰的秘诀

浴室不再仅仅是个洗漱的地方&#xff0c;如今它们是室内设计的一部分&#xff0c;有时甚至是焦点。浴室的装饰风格可以塑造整个房间的氛围&#xff0c;而浴缸通常是浴室内最引人注目的元素之一。在这里&#xff0c;我们将简单探讨不同室内设计风格与浴缸如何融合&#xff0c;让…

PlantSimulation安装帮助文档端口被占用的解决办法

PlantSimulation安装帮助文档端口被占用的解决办法 从PlantSimulaiton&#xff08;TPS&#xff09;2201开始帮助文档开始使用在线&#xff0c;如果使用本地则需要安装本地文档服务器。但是在安装过程中你可能会遇到&#xff0c;5000断开被占用的情况。解决办法如下&#xff1a…

C# 发送邮件

1.安装 NuGet 包 2.代码如下 SendMailUtil using MimeKit; using Srm.CMER.Application.Contracts.CmerInfo; namespace Srm.Mail { public class SendMailUtil { public async static Task<string> SendEmail(SendEmialDto sendEmialDto,List<strin…

java APP自动化测试AppIum

一、前言 二、Appium环境搭建 2.1 JDK安装 2.2 Android SDK安装配置 2.3 模拟器安装及配置 2.4 Appium Desktop安装及使用 2.5 Appium配置连接模拟器 三、实战基本脚本编写 3.1 创建Maven项目并配置 3.2 简单Demo 四、写在最后 一、前言 随着移动互联网的发展&#xff0c;AP…

mac录屏快捷键指南,轻松录制屏幕内容!

“大家知道mac电脑有录屏快捷键吗&#xff0c;现在录屏不太方便&#xff0c;每次都花很多时间&#xff0c;要是有录屏快捷键&#xff0c;应该会快速很多&#xff0c;可是哪里都找不到&#xff0c;有人知道吗&#xff1f;帮帮我&#xff01;” 苹果的mac电脑以其精美的设计和卓…

Java使用pdfbox进行pdf和图片之间的转换

简介 pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图.引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>…

AIGC|把Azure Open AI和Jira集成起来,实现智能化项目管理

目录 一、Jira与Azure OpenAI介绍 二、Jira和Azure OpenAI的REST API对接 三、利用Chats插件实现对话的过程 四、总结 一、Jira与Azure OpenAI介绍 Jira是一款由澳大利亚公司Atlassian开发的项目管理工具&#xff0c;主要用于追踪问题、管理需求、构建报告和管理故障等事项…

ruby语言怎么写个通用爬虫程序?

Ruby语言爬虫是指使用Ruby编写的网络爬虫程序&#xff0c;用于自动化地从互联网上获取数据。其中&#xff0c;CRawler是一个基于文本的小型地牢爬虫&#xff0c;它被设计为可扩展&#xff0c;所有游戏数据均通过JSON文件提供&#xff0c;程序仅处理游戏引擎。除此之外&#xff…

EasyExcel复杂表头数据导入

目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…

OSPF 高级特性3

一、OSPF安全特性 1、OSPF报文验证&#xff1a; 区域验证模式&#xff1a;在区域下配置一致的密码才能加入同一个区域。 [r3-ospf-1-area-0.0.0.0]authentication-mode md5 1 cipher 123456 接口验证模式&#xff1a;链路两端的接口必须配置一致的密码才能建立邻居关系 [r5-Gig…

回归预测 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测

Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量…

oracel处理XML时,报ORA-31011、ORA-19202。

原字段为clob&#xff0c; 查询 SELECT XMLTYPE(字段) FROM TABLE_A报错如下&#xff1a; ORA-31011: XML 语法分析失败 ORA-19202: XML 处理 LPX-00217: invalid character 12 (U000C) Error at line 1559时出错 ORA-06512: 在 "SYS.XMLTYPE", line 272 ORA-0651…

大洋钻探系列之一引子

大洋科学钻探计划自1968年启动开始&#xff0c;迄今已有50余年&#xff0c;先后经历了&#xff14;个阶段。深海钻探计划(Deep Sea Drilling Program&#xff0c;DSDP&#xff0c;1968-1983年&#xff09;、国际大洋钻探计划&#xff08;Ocean Drilling Program&#xff0c;ODP…

目标检测 图像处理 计算机视觉 工业视觉

目标检测 图像处理 计算机视觉 工业视觉 工业表盘自动识别&#xff08;指针型和数值型&#xff09;智能水尺识别电梯中电动车识别&#xff0c;人数统计缺陷检测&#xff08;半导体&#xff0c;电子元器件等&#xff09;没带头盔检测基于dlib的人脸识别抽烟检测和睡岗检测/驾驶疲…

【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

前言 这里是【使用Python编写游戏辅助工具】的第三篇&#xff1a;鼠标连击器的实现。本文主要介绍使用Python来实现鼠标连击功能。 鼠标连击是指在很短的时间内多次点击鼠标按钮&#xff0c;通常是鼠标左键。当触发鼠标连击时&#xff0c;鼠标按钮会迅速按下和释放多次&#xf…

双十一快递“当天达”?宏电助力物流分拣系统高效运行

​众所周知&#xff0c;每年双11都是快递业务的高峰期&#xff0c;是对各大物流企业运输能力的一次大考。为了持续提升快递配送的速度&#xff0c;自动化物流仓储建设的速度也在不断的加快&#xff0c;而在一个完整的自动化物流仓储系统中&#xff0c;输送分拣设备是物流自动化…

MySql优化经验分享

一条sql的具体执行过程 连接 我们怎么查看MySQL当前有多少个连接&#xff1f; 可以用show status命令&#xff0c;模糊匹配Thread&#xff0c; Show global status like "Thread%" show global variables like wait timeout;—非交互式超时时间&#xff0c;如JDBC…

c++ | 字符串与指针的恩断情仇

我想&#xff0c;c/c中难的不是指针&#xff0c;而是其中的变化&#xff0c;尤其是思维的转变。很多东西 就是容易掉进陷阱。好在&#xff0c;你我都是善于思考的码农&#xff01; 大致情况是这样的&#xff0c;底层<–>c语言<–>c<–>应用 而数据的传输的最…