【栈】| 力扣高频题: 基本计算器二

devtools/2024/10/21 5:38:01/

🎗️ 主页:小夜时雨
🎗️专栏:算法题
🎗️如何活着,是我找寻的方向

优雅

目录

  • 1. 题目解析
  • 2. 代码

1. 题目解析

题目链接: https://leetcode.cn/problems/basic-calculator-ii/description/ (可点击)

在这里插入图片描述

本道题是的经典应用问题:表达式求值问题, 我们依旧是采取 + 分类讨论的方式。

解决思路:

利用来模拟计算过程,中间用到分类讨论

  1. 初始化一个操作符字符为 ‘+’, 为了统一操作,想法:把所有处理过的数字,全部放到中,而且中的数只需要最后相加就是最后答案。
  2. 分情况讨论: 遍历字符串,题目中还有空格,遇到空格直接跳过。
  3. 遇到操作符,不做其他操作,直接更新操作符变量,遍历下一个。因为我们是遇到数字的时候才会进行计算和入
  4. 遇到数字,有可能是一个多位数的数字,所以要先提取出数字。
  • 判断这个数字前的操作符是什么,来进行入操作。
  • 是 ‘+’, 数字直接入即可
  • 是 ‘-’,数字的相反数入即可
  • 是 ‘*’,就可以进行计算了, 因为这里没有括号,所以乘和除的计算优先级最高,步骤:取出顶元素相乘,之后继续放到
  • 是 ‘-’,取出顶元素除以数字,之后放到
  1. 中处理过的数字出进行相加

接下来的代码里还会再次进行强调的,看下面的图更容易理解:

在这里插入图片描述

2. 代码

看下面的代码对照着上面的流程解析可能会更加的清楚。

java">class Solution {// 练习public int calculate(String s1) {// 利用一个双端队列 deque, 先计算乘除. 或者是  Stack 也是可以的Deque<Integer> stack = new ArrayDeque<>();int n = s1.length(), i = 0;char op = '+'; // 初始化为 + 号, 为了统一操作: 加入第一个数char[] s = s1.toCharArray();while(i < n) {// 1. 碰见空格, 忽略if(s[i] == ' ') i++;// 2. 碰见数字else if (s[i] >= '0' && s[i] <= '9') {// 提取出数字(有可能是两位或者三位数)int tmp = 0;while(i < n && s[i] >= '0' && s[i] <= '9') {tmp = tmp * 10 + s[i] - '0';i++;}// 提取之后, 判断当前数字前面的符号, 根据符号入if(op == '+') stack.push(tmp);else if(op == '-') stack.push(-tmp);else if(op == '*') {// stack.peek() * tmp; 泛型是 Integer, 不是引用类型, 所以不能用 peek, 指向的不是同一个地址// 8.25 更新: 感觉上面说的话不对应该,应该是忘记弹出了// 下一个题中的 泛型是 StringBuffer 就可以stack.push( stack.pop() * tmp );} // else stack.peek() / tmp;else stack.push( stack.pop() / tmp );// i 已经执行非数字了, 所以不用 i++ 了// 3. 碰见符号了, 直接更新符号即可     } else {op = s[i];i++;}}// 遍历完之后, 把里的元素进行相加int ret = 0;while(!stack.isEmpty()) {ret += stack.pop();}return ret;}
}

🎗️🎗️🎗️ 好啦,到这里有关本题的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆


http://www.ppmy.cn/devtools/104168.html

相关文章

日常刷题(24)

1. 拼接最大数 1.1. 题目描述 给你两个整数数组 nums1 和 nums2&#xff0c;它们的长度分别为 m 和 n。数组 nums1 和 nums2 分别代表两个数各位上的数字。同时你也会得到一个整数 k。 请你利用这两个数组中的数字中创建一个长度为 k < m n 的最大数&#xff0c;在这个必…

力扣1425.带限制的子序列和

力扣1425.带限制的子序列和 单调队列优化dp f[i] 表示在数组的前 i 个数中进行选择&#xff0c;并且恰好选择了第 i 个数&#xff0c;可以得到的最大和状态转移&#xff1a;f[i] max(max(f[j]) , 0) nums[i];单调队列优化&#xff1a;储存前K个f[i]&#xff0c;并且单调&…

HarmonyOS应用开发者基础认证 | <HarmonyOS第一课>习题-ArkTS语法

1. 下面示例中会导致编译报错的有&#xff1f; A. let x: number null&#xff1b; B. let x: number | null null&#xff1b; C. let y: string null&#xff1b; D. let y: string 100&#xff1b; 看来GPT对这种标准概念选择&#xff0c;也没有统一的说法。 文心一…

MATLAB发票识别系统

课题介绍 该课题为基于MATLAB的发票识别系统。主要识别发票的编号。可定做发票的日期&#xff0c;金额等字段的识别。通过输入图片&#xff0c;校正&#xff0c;定位目标区域&#xff0c;分割&#xff0c;字符分割&#xff0c;模板匹配识别&#xff0c;得出结果。整个设计包含…

数据结构:树形结构(树、堆)详解

数据结构&#xff1a;树形结构&#xff08;树、堆&#xff09;详解 一、树&#xff08;一&#xff09;树的性质&#xff08;二&#xff09;树的种类二叉树多叉树满N叉树完全N叉树 &#xff08;三&#xff09;二叉树的实现1、二叉树结构定义2、二叉树功能实现&#xff08;1&…

unity面试:LOD是什么,优缺点是什么?

LOD&#xff08;Level of Detail&#xff0c;细节层级&#xff09;是一种用于3D图形和游戏开发的技术&#xff0c;用于根据相机与物体之间的距离动态选择和显示不同细节级别的模型。这种技术可以显著提高性能&#xff0c;同时保持视觉质量。以下是关于LOD的详细说明&#xff0c…

如何将线程绑定到特定的CPU核

要将线程绑定到特定的CPU核&#xff08;也称为“设置CPU亲和性”&#xff09;并分配资源&#xff0c;可以使用pthread库结合sched库中的函数来实现。具体来说&#xff0c;Linux系统中有pthread和sched库函数&#xff0c;例如pthread_setaffinity_np()来设置线程的CPU亲和性。 …

Golang 开发使用 gorm 时打印 SQL 语句

目录 1. 使用 Debug 方法2. 全局设置日志级别3. 自定义 Logger4. 总结 参考 gorm 文档&#xff1a;https://gorm.io/zh_CN/docs/logger.html Gorm 有一个 默认 logger 实现&#xff0c;默认情况下&#xff0c;它会打印慢 SQL 和错误。如果想要全部或部分打印 SQL 的话可以通过设…