力扣(LeetCode)227. 基本计算器 II

2024-01-26 15:36

本文主要是介绍力扣(LeetCode)227. 基本计算器 II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

因为在做这题的原因是我刚学完栈的相关之后想找一些和栈有关的题,所以这道题我是从如何用栈来解决问题作为出发点进行思考的,可能有其他更好的思路,请多多包涵.

做题思路:首先不知道写什么先创建一个栈,再思考我第一个先想到的是要对进来的数据先进行判断,

Character.isDigit(s.charAt(i))

 是一个 Java 字符串处理的方法,它用于判断指定索引处的字符是否是一个十进制数字。(s.charAt(i) 是用于获取字符串 s 中索引为 i 处的字符。)

因为s是String(字符串)类型所以要转换为整数类型,字符 '0' 对应的整数值是 48,所以s.charAt(i) - '0' 这部分是将字符型数字转换为相应的整数值,接着,num * 10 将当前 num 变量的值乘以 10,相当于给 num 左移一位(乘以 10 相当于在末尾添加一位 0).这样就可以将连续的字符串转换为整数型,方便用来计算

class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();int num = 0;for (int i = 0; i < n; i++) {if (Character.isDigit(s.charAt(i))) {num = num * 10 + s.charAt(i) - '0';}}}
}

先提示下,

  1. 入栈(Push):将元素添加到栈的顶部。

  2. 出栈(Pop):从栈的顶部移除并返回元素。

Character.isSpaceChar(s.charAt(i))

 是一个 Java 中用于判断指定字符是否属于"空格字符"的方法调用。

在对判断时的特殊情况进行处理

!Character.isDigit(s.charAt(i)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1
  • 如果指定索引 i 处的字符不是一个数字字符且不是一个空格字符,或者 i 等于指定字符串 s 的长度减去 1(即最后一个字符的索引),则返回 true
  • 否则,返回 false

之后,我们该有的都有了,就开始对已经处理好的整数值进行处理,利用栈的特性和switch-case进行判断.

  • 如果是 + 运算符,则将当前数字入栈.
  • 如果是 - 运算符,则将当前数字的负值入栈.
  • 如果是 * 运算符,则将栈顶数字弹出 (stack.pop()),与当前数字相乘后再入栈.
  • 如果是 / 运算符,则将栈顶数字弹出,除以当前数字后再入栈.
  • 在遇到非数字字符或字符串末尾时,需要将当前数字清零 (num = 0),以便接下来的数字累加.
  • class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();char preSign = '+';int num = 0;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)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1) {switch (preSign) {case '+':stack.push(num);break;case '-':stack.push(-num);break;case '*':stack.push(stack.pop() * num);break;case '/':stack.push(stack.pop() / num);break;}preSign = s.charAt(i);num = 0;}}}
    }

,最后在对栈中得到的元素进行累加,再将结果返回就得到题目的答案了

int ans = 0;while (!stack.isEmpty()) {ans += stack.pop();}return ans;

这是最终的代码,大家可以学习下.

class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();char preSign = '+';int num = 0;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)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1) {switch (preSign) {case '+':stack.push(num);break;case '-':stack.push(-num);break;case '*':stack.push(stack.pop() * num);break;case '/':stack.push(stack.pop() / num);break;}preSign = s.charAt(i);num = 0;}}int ans = 0;while (!stack.isEmpty()) {ans += stack.pop();}return ans;}
}

到这里就结束了感谢你的浏览.

这篇关于力扣(LeetCode)227. 基本计算器 II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647262

相关文章

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更