当前位置: 首页 > news >正文

LeetCode题练习与总结:基本计算器 Ⅱ--227

一、题目描述

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1] 的范围内。

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

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 2^31 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数

二、解题思路

这个问题可以使用栈(stack)来解决。我们使用两个栈,一个用于存储操作数,另一个用于存储操作符。遍历字符串s,根据遇到的字符类型(数字、操作符或空格)进行相应的处理。

  1. 当遇到数字时,将其转换为整数并存储在操作数栈中。
  2. 当遇到操作符时,需要考虑操作符的优先级。如果当前操作符的优先级高于栈顶操作符的优先级,则直接将当前操作符入栈。否则,需要先计算栈顶的操作符,并将结果重新入栈,然后比较当前操作符与新的栈顶操作符的优先级。
  3. 当遇到空格时,忽略它。
  4. 对于乘法和除法,因为它们的优先级高于加法和减法,所以一旦遇到乘号或除号,需要立即计算结果,并将结果入栈。
  5. 对于加法和减法,可以直接将操作数入栈,因为它们可以在最后一起计算。

以下是具体的步骤:

  • 初始化两个栈:一个用于存储操作数(nums),另一个用于存储操作符(ops)。
  • 遍历字符串s,对于每个字符c
    • 如果c是空格,则忽略。
    • 如果c是数字,则解析出完整的数字并压入nums栈。
    • 如果c是操作符(+-*/):
      • 如果ops栈为空或者栈顶的操作符是(,则直接将c压入ops栈。
      • 如果c*/,则从nums栈中弹出两个操作数进行计算,并将结果压回nums栈。
      • 如果c+-,并且ops栈顶不是(,则从nums栈中弹出两个操作数进行计算,并将结果压回nums栈,然后将c压入ops栈。
  • 遍历完成后,如果ops栈中还有操作符,则继续从nums栈中弹出操作数进行计算,直到ops栈为空。
  • 最后,nums栈中的唯一元素即为表达式的结果。

三、具体代码

import java.util.Stack;public class Solution {public int calculate(String s) {Stack<Integer> nums = new Stack<>();Stack<Character> ops = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == ' ') continue;if (Character.isDigit(c)) {int num = 0;while (i < s.length() && Character.isDigit(s.charAt(i))) {num = num * 10 + (s.charAt(i) - '0');i++;}i--; // since the for loop also increments inums.push(num);} else if (c == '(') {ops.push(c);} else if (c == ')') {while (ops.peek() != '(') {nums.push(applyOp(ops.pop(), nums.pop(), nums.pop()));}ops.pop();} else if (c == '+' || c == '-' || c == '*' || c == '/') {while (!ops.isEmpty() && hasPrecedence(c, ops.peek())) {nums.push(applyOp(ops.pop(), nums.pop(), nums.pop()));}ops.push(c);}}while (!ops.isEmpty()) {nums.push(applyOp(ops.pop(), nums.pop(), nums.pop()));}return nums.pop();}public boolean hasPrecedence(char op1, char op2) {if (op2 == '(' || op2 == ')') return false;if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) return false;return true;}public int applyOp(char op, int b, int a) {switch (op) {case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;}return 0;}
}

请注意,代码中的applyOp方法假设栈中的操作数顺序是正确的,并且对于减法和除法,ab的顺序很重要(a是被操作数,b是操作数)。代码也处理了括号的情况,确保在遇到右括号时,所有括号内的表达式都会被计算。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历字符串s:假设字符串s的长度为n,则遍历字符串的时间复杂度为O(n)
  • 解析数字:在遍历过程中,每次遇到数字,需要解析出完整的数字。在最坏的情况下,数字可能连续出现,这意味着对于每个数字字符,我们需要进行一次操作。因此,解析数字的总操作次数也是O(n)
  • 应用操作符:在遍历字符串的过程中,每次遇到操作符,我们可能需要从栈中弹出元素进行计算,然后将结果压回栈中。在最坏的情况下,可能需要对每个操作符都进行这样的操作。由于每个操作符最多被处理一次,因此这一步的时间复杂度也是O(n)

综上所述,总的时间复杂度为O(n),其中n是字符串s的长度。

2. 空间复杂度
  • 操作数栈nums:在最坏的情况下,所有数字都直接入栈,没有进行任何计算,因此栈的大小可能达到O(n)
  • 操作符栈ops:在最坏的情况下,所有操作符都直接入栈,没有进行任何计算,因此栈的大小可能达到O(n)

综上所述,总的空间复杂度为O(n),其中n是字符串s的长度。

这里的O(n)表示算法的复杂度与输入字符串的长度成线性关系。在实际情况中,由于数字不会连续占据整个字符串,操作符栈和操作数栈的大小通常会小于n,但最坏情况下的复杂度分析仍然是O(n)

五、总结知识点

  • 栈(Stack)的使用

    • 栈是一种后进先出(Last In First Out, LIFO)的数据结构。
    • 在Java中,Stack类是java.util包中的一个类,用于实现栈数据结构。
  • 字符和字符串操作

    • 使用char类型来处理单个字符。
    • 使用String类的charAt方法来获取字符串中指定位置的字符。
    • 使用Character.isDigit方法来判断一个字符是否是数字。
  • 数字解析

    • 通过循环和字符减去’0’的方式,将字符串中的连续数字字符转换为整数。
  • 运算符优先级

    • 在处理算术表达式时,需要根据运算符的优先级来决定计算的顺序。
    • 使用hasPrecedence方法来判断当前运算符与栈顶运算符的优先级关系。
  • 条件逻辑

    • 使用if-else语句来处理不同类型的字符(空格、数字、运算符、括号)。
    • 使用while循环来处理连续的数字字符,以及应用运算符。
  • 异常处理

    • 虽然在给出的代码中没有显示异常处理,但在实际应用中,应当考虑除法操作可能导致的ArithmeticException(如除以零)。
  • 递归下降

    • 在处理括号时,实际上隐式地使用了递归下降解析的原理,通过递归地将括号内的表达式视为一个子表达式来处理。
  • 运算符应用

    • 使用applyOp方法来根据运算符执行相应的算术运算。
  • 算法逻辑

    • 理解和实现一个基本的算术表达式求值算法,这涉及到算法设计的基本概念。
  • 类型转换

    • 在将字符转换为整数时,涉及到从charint的类型转换。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

LeetCode题练习与总结:基本计算器 Ⅱ--227

一、题目描述 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表达式计算…...

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…...

c语言--力扣简单题目(链表的中间节点)讲解

题目如下&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点…...

【STM32 Blue Pill编程】-定时器计数模式

定时器计数模式 文章目录 定时器计数模式1、定时器计数模式介绍2、硬件准备及接线3、模块配置3.1 定时器计数模式配置3.2 定时器中断配置3.3 串口配置4、代码实现在本文中,我们将讨论如何在计数器模式下配置 STM32 Blue Pill 定时器模块。 要将定时器用作计数器,我们将其配置…...

【例题】lanqiao1331 二进制中 1 的个数

二进制中 1 的个数 题目描述 给定一个整数 x&#xff0c;输出该数二进制表示中 1 的个数。 例&#xff1a;9 的二进制表示为 1001&#xff0c;有 2 位是 1 &#xff0c;所以函数返回 2。 输入描述 输入 x​ &#xff08;内存空间为 32 位的整数&#xff09;。 输出描述 第一…...

【论文解读】图像序列识别:CRNN技术在场景文本识别中的应用与突破(附论文地址)

论文地址&#xff1a;https://arxiv.org/pdf/1507.05717 这篇文章的标题是《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》&#xff0c;作者是Baoguang Shi, Xiang Bai和Cong Yao&#xff0c…...

Vue3+CesiumJS相机定位camera

new Cesium.Camera (scene) 摄像机由位置&#xff0c;方向和视锥台定义。 方向与视图形成正交基准&#xff0c;上和右视图x上单位矢量。 视锥由6个平面定义。每个平面都由 Cartesian4 对象表示&#xff0c;其中x&#xff0c;y和z分量定义垂直于平面的单位矢量&#xff0c;w分量…...

turbo译码算法MAX, MAX_SCALE and MAX_STAR的比较

在Turbo码的译码算法中&#xff0c;MAX、MAX_SCALE和MAX_STAR是涉及对数似然比&#xff08;LLR&#xff09;计算时&#xff0c;对MAP&#xff08;最大后验概率&#xff09;算法或其变种Log-MAP算法中分支度量计算的几种不同处理方式。下面是对这三种方法的比较&#xff1a; 1.…...

关于HarmonyOS的学习

day31 购物车案例 一、加入购物车 1、点击按钮后&#xff0c;把当前这个列表的数据拿到&#xff0c;应该存储到一个数组里面 --- 数据结构&#xff0c;把数据存储进行数组2、假如已经把所有的数据添加数组完毕&#xff0c;最终应该存储进购物车里面&#xff0c;所谓的购物车说…...

【雅特力AT32】搭建模板工程及GPIO点灯操作

目录 AT32模板工程建立及点灯操作 建立AT32模板工程 AT32点灯操作 LED原理图GPIO寄存器LED源码分析 建立AT32模板工程 从0到编译运行详细搭建保姆教程&#xff1a; 【雅特力AT32】Keil 环境&#xff1a;搭建标准库模板工程、使用 AT-Link、Debug 里选择 CMSIS-DAP调试器 下面做…...

实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试

画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。 一、简介 阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大…...

数据库索引底层数据结构之B+树MySQL中的页索引分类【纯理论干货,面试必备】

目录 1、索引简介 1.1 什么是索引 1.2 使用索引的原因 2、索引中数据结构的设计 —— B树 2.1 哈希 2.2 二叉搜索树 2.3 B树 2.4 最终选择之——B树 2.4.1 B树与B树的对比(面向索引)【面试题】 3、MySQL中的页 3.1 页的使用原因 3.2 页的结构 3.2.1 页文件头和页文件…...

编译QT源码时的configure参数须知

文章目录 一、configure help原文二、configure help机译三、features 执行命令得到configure帮助文件 qtsrc/configure --help一、configure help原文 Usage: configure [options] [-- cmake-options]This is a convenience script for configuring Qt with CMake. Options…...

如何利用人工智能大模型来进行数字化营销?

这是一本关于如何利用人工智能大模型来进行数字化营销并驱动业绩增长的书。人工智能大模型是指那些具有超大规模的参数和数据的人工智能模型&#xff0c;它们能够在各种复杂的任务上表现出惊人的能力。 在本书中&#xff0c;你将学习到如何在电商、广告和用户增长等数字化营销业…...

【MRI基础】回波序列长度-echo train length ETL概念

回波序列长度 回波序列长度 (echo train length, ETL) 是磁共振成像 (MRI) 中的一个重要参数&#xff0c;它对图像采集时间和图像质量有显著影响。ETL 是指在单个激励脉冲之后的 MRI 序列中采集的回波数量。通过增加 ETL&#xff0c;可以在一个重复时间 (TR) 内收集多个回波&a…...

(179)时序收敛--->(29)时序收敛二九

1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时序收敛二九 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域…...

[Visual Stuidio 2022使用技巧]2.配置及常用快捷键

使用vs2022开发WPF桌面程序时常用配置及快捷键。 语言&#xff1a;C# IDE&#xff1a;Microsoft Visual Studio Community 2022 框架&#xff1a;WPF&#xff0c;.net 8.0 一、配置 1.1 内联提示 未开启时&#xff1a; 开启后&#xff1a; 开启方法&#xff1a; 工具-选…...

每日奇难怪题(持续更新)

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…...

江协科技STM32学习- P13 TIM定时器中断

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

git github仓库管理

原文链接&#xff1a;git github仓库管理 拉取镜像 github的仓库有两种下载方式,http和ssh,http是对外公开的,可以直接clone,ssh的一般是自己的或内部的仓库,仓库需要配置ssh-key才能使用git clone. 或者直接网页下载 #https git clone https://github.com/git/git.git #ssh…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...