leetcode(力扣) 224. 基本计算器(清晰思路,完整模拟)

2023-11-01 06:36

本文主要是介绍leetcode(力扣) 224. 基本计算器(清晰思路,完整模拟),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:
输入:s = “1 + 1”
输出:2

示例 2:
输入:s = " 2-1 + 2 "
输出:3

示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23

思路分析

模拟!开始!

例子:s = “(1+(4+5+2)-3)+(6+8)”

先设几个变量,别问为什么,先记就行。

1.变量res,记录当前括号里的内容总和。比如(4+5+2) 那总和就是res=11
2.变量num,记录当前整体数字,因为要遍历s,所以如果有152+1 这种,那么遍历的指针就应该是1,5,2,+,1。 然而152是一个数字整体,所以需要有一个num变量来应对这种情况。
3.变量sign,一个符号变量,1表示为加号,-1表示为减号。
4.变量stack。是个栈,存什么后面再说。

操作的步骤是:

  • 如果当前是数字,那么更新计算当前数字;
  • 如果当前是操作符+或者-,那么需要更新计算当前计算的结果 res,并把当前数字 num 设为 0,sign 设为正负,重新开始;
  • 如果当前是 ( ,那么说明遇到了右边的表达式,而后面的小括号里的内容需要优先计算,所以要把 res,sign 进栈,更新 res 和 sign 为新的开始;
  • 如果当前是 ) ,那么说明右边的表达式结束,即当前括号里的内容已经计算完毕,所以要把之前的结果出栈,然后计算整个式子的结果;
    最后,当所有数字结束的时候,需要把最后的一个 num 也更新到 res 中。

模拟过程:

例子:s = “(1+(4+5+2)-3)+(6+8)”

初始化:

res = 0
sign = 1
num = 0

其实这个初始化方法,可以理解成 s = 0+(1+(4+5+2)-3)+(6+8),在最前面多了一个0+

  • 遍历,当前字符为 ‘(’,直接将当前的res和sign进栈。然后重置res=0和sign=1。这里其实可以理解为,遇到 ‘(’ 说明发现了一个更深层的嵌套,此时将该深层嵌套外的值res和其符号sign都记录到栈里,然后重置了他俩,继续算更深层的括号。
  • 继续遍历遇到字符 ‘1’ ,没的说直接计算当前累计值num,也就是num = 10 * num + 当前值。
  • 继续遍历遇到字符 ‘+’ ,此时遇到加号说明num已经完整记录了当前数字(比如159,num已经等于159了,而不是1或者15)。计算当前的累计值res+=sign*num。这个没啥好说的 当前完整字符num乘以符号。
  • 继续遍历遇到字符 ‘(’,同样,res和sign进栈,然后重置res和sign。
  • 继续遍历遇到字符 ‘4’ ,计算num = 4
  • 继续遍历到字符 ‘+’,计算当前res = 4,重置num和sign。
  • 继续遍历到。。。直到第一个 ‘)’ ,说明当前括号已经算完,先算出来当前括号内的res,然后重置num,然后计算当前res和栈内保存的之前的数值(左边表达式的值)。比如在遍历到该 ‘)’ 时的stack = [0,‘1’,1,‘1’],这里解释一下,stack里的第一个值和第二个值就是我们初始化的res和sign。也就是s = 0+(1+(4+5+2)-3)+(6+8),最前面扩充出来的0和+。stack里第二个值和第三个值就是在s = (1+(4+5+2)-3)+(6+8)遇到第二个 “(” 时候记录的他之前计算的值以及符号,显然是1和正号。当遇到右括号时,此时res就是(4+5+2)=11。符号sign为1。所以有 res *= stack.pop(),res += stack.pop()

完整代码

class Solution:def calculate(self, s: str) -> int:stack = []res = 0 # 记录当前括号内的总值num = 0 # 记录当前值的整体(比如156这种多位数)sign = 1  # 记录符号  1为正好, -1 为负号for c in s:if c.isdigit(): # 为数字的情况num = num*10 + int(c)elif c in '+-': # 正负号的情况res+= sign* numnum = 0sign = 1 if c =='+' else -1elif c =='(': # 左括号的情况,进入了一个新的更深的嵌套stack.append(res)stack.append(sign)res = 0sign = 1elif c == ')': # 退出了当前嵌套res +=sign*numres *=stack.pop()res +=stack.pop()num = 0res += num* sign return res```

这篇关于leetcode(力扣) 224. 基本计算器(清晰思路,完整模拟)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

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

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

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.