LeetCode 224. 基本计算器

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
提示:
1 <= s.length <= 3 * 105
s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成
s 表示一个有效的表达式
‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效)
‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数

我的解法

class Solution:def calculate(self, s: str) -> int:stack, num, sign = [], None, 1for c in s:# 空白就跳过if c == ' ':continue# 数字就暂存if c in "1234567890":if num is None:num = 0num = num * 10 + int(c)continue# 非数字首先看看是否可以入栈数字if num is not None:stack.append(sign * num)num, sign = None, 1if c == "(":if sign == -1:stack.append("-")sign = 1stack.append(c)elif c in ("+", "-"):if not stack or stack[-1] in ("+", "-", "(", ")"):sign = 2 * (c == "+") - 1else:stack.append(c)else:# c == ")"_num = 0while True:a = stack.pop()if a == "(":stack.append(_num)breakelse:if stack[-1] in ("+", "-"):_num += a * (2 * (stack.pop() == "+") - 1)else:_num += aif num is not None:stack.append(sign * num)num, sign =0, 1for c in stack:if c in ("+", "-"):sign = 2 * (c == "+") - 1else:num += sign * creturn num

参考大佬的进阶解法写一写

from collections import deque
from operator import add, sub, mul, truediv, mod, powclass Solution:def calculate(self, s: str) -> int:# 预处理字符串# 1. 去除空格# 2. 处理单目运算符 +-_s = []for idx, c in enumerate(s):if c == ' ':continueif c in ("+", "-") and (not _s or _s[-1] == "("):_s.append('0')_s.append(c)s = "".join(_s)priority = {"+": 1, "-": 1, "*": 2, "/": 2, "%": 2, "^": 3}operation = {"+": add, "-": sub, "*":mul, "/": lambda a, b: int(truediv(a, b)), "%": mod, "^": pow}nums = deque([])  # 操作数栈ops = deque([]) # 操作符栈i, n = 0, len(s)while i<n:c = s[i]# 解析操作数if c.isdigit():j, _num = i, 0while j < n and s[j].isdigit():_num = _num * 10 + int(s[j])j += 1nums.append(_num)i = j - 1elif c == "(":ops.append(c)elif c in operation.keys():while ops and ops[-1] != "(" and priority[ops[-1]] >= priority[c]:b, a, o = nums.pop(), nums.pop(), ops.pop()nums.append(operation[o](a, b))ops.append(c)else:  # c == ")"while ops and ops[-1] != "(":b, a, o = nums.pop(), nums.pop(), ops.pop()nums.append(operation[o](a, b))if ops and ops[-1] == "(":ops.pop()i += 1while ops and ops[-1] != "(":b, a, o = nums.pop(), nums.pop(), ops.pop()nums.append(operation[o](a, b))return nums.pop()print(Solution().calculate("-1 + (-1+(4+5+2)-3)+(6+8)"))  # '0-1+(0-1+(4+5+2)-3)+(6+8)'

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

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

相关文章

GNU/Linux - 压缩解压文件

在 Linux 中&#xff0c;压缩和解压缩文件夹或文件的方法有很多。下面详细列出了最常用的方法以及相应的压缩和解压缩命令&#xff1a; There are numerous methods to compress and uncompress a folder or files in Linux. Below is a detailed list of the most common meth…

量化交易研究报告#13

核心公式 通过对 HS300 相对强弱指标值变化规律的梳理&#xff0c;我们制定如下的交易法则&#xff1a; &#xff08;1&#xff09;计算指标的 20 日均值变化&#xff0c;以及 20 日标准差&#xff1b; &#xff08;2&#xff09;20日均值1倍标准差作为上阈值&#xff0c;20…

【Chapter 3: Creating Minimal API Applications】

Chapter 1: Foundations of Framework Learning and Practical Strategies Chapter 2: An Introduction to ASP.NET Core in Layman‘s Terms Chapter 3: Creating Minimal API Applications 1. Overview of Minimal APIs In the vast landscape of ASP.NET Core, “Minima…

Mysql表的三范式、事务和查询

数据表的三范式 在制定数据表,需要遵循的制表规范:第一范式(1NF),第二范式(2NF),第三范式(3NF) 第一范式 属性不可分割,每一个属性(每一个单元格)都是不可再分的原子,也就是说数据表中的每一个字段必须是单独一列的,不能出现还可以再拆分的情况,也可以说成是…

数电基础 - 半导体存储

目录 一. 简介 一. 只读存储器 二. 可编程只读存储器 三. 可擦除的可编程只读存储器 四. 随机存储器 五. 存储器容量的扩展 六. 总结 一. 简介 半导体存储是数字电路中用于存储数据的重要组成部分。 半导体存储器主要分为两大类&#xff1a;随机存取存储器&#xff0…

智能交通系统包含多个子系统和功能,如交通信号控制、车辆导航、电子收费、紧急救援、公共交通管理等。

智能交通系统&#xff08;Intelligent Transportation System, ITS&#xff09;是一个集成了先进的信息技术、数据通信传输技术、电子传感技术、控制技术及计算机技术等&#xff0c;并有效应用于整个交通运输管理体系的地面交通管理系统。它的目标是提高道路使用效率、减少交通…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别&#xff08;automatic-speech-recognition&#xff09; 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

【Vue】 style中的scoped

一、什么是scoped&#xff0c;为什么要用 在vue文件中的style标签上&#xff0c;有一个特殊的属性&#xff1a;scoped。 当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染…

16001.WSL2 ubuntu20.04 编译安装 vsomeip

文章目录 1 vsomeip 编译安装1.1 vsomeip的安装1.2 编译提示错误1.3 编译hello_world示例1.4 运行服务器端 1 vsomeip 编译安装 1.1 vsomeip的安装 参考博文 https://blog.csdn.net/peterwanye/article/details/128386539 1.2 编译提示错误 ubuntu1-BJ-EE1000042:~/opt/vso…

Flask启动5000端口后关不掉了?

事情是这样的&#xff1a; 使用python app.py启动flask应用后&#xff0c;又启动了另一个flask测试应用&#xff0c;也能启动成功&#xff0c;也没有报设么端口冲突&#xff0c;关闭黑窗口后&#xff0c;访问还是有守护进程在运行&#xff0c; 为什么我知道5000还在运行&#…

深入理解缓冲区:提升程序性能的关键

深入理解缓冲区&#xff1a;提升程序性能的关键 1、什么是缓冲区&#xff1f;2、缓冲区的作用3、缓冲区在Java中的应用4、如何操作缓冲区5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 缓冲区&#xff08;Buffer&#xff09;是一种…

2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛--学习笔记

#Datawhale #NLP 1.背景介绍&#xff1a; 机器翻译&#xff08;Machine Translation&#xff0c;简称MT&#xff09;是自然语言处理领域的一个重要分支&#xff0c;其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代&#xff0c;经历…

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图&#xff0c;与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…

live555 rtsp服务器实战之createNewStreamSource

概述 live555用于实际项目开发时&#xff0c;createNewStreamSource和doGetNextFrame是必须要实现的两个虚函数&#xff0c;一般会创建两个类来实现这两个函数&#xff1a;假如这两个类为H264LiveVideoServerMediaSubssion和H264FramedLiveSource&#xff1b; H264LiveV…

信息素养大赛-2024-算法创意实践挑战复赛-小学组

文章目录 一、前言二、问题问题&#xff1a;玫瑰花地的面积问题&#xff1a;判断三角形问题&#xff1a;汤姆的日记问题&#xff1a;正方形的数量问题&#xff1a;字符操作问题&#xff1a;猴子摘桃 三、感谢 一、前言 本章节主要对2024年信息素养大赛算法创意实践挑战复赛小学…

通用图形处理器设计GPGPU基础与架构(三)

一、前言 前两篇已经介绍了 GPGPU 的背景 和 GPGPU 的编程模型相关的内容&#xff0c;本文将在 SIMT 计算模型的基础上&#xff0c;介绍 GPGPU 控制核心架构和微体系结构的设计。 二、CPU-GPGPU 异构计算系统 一个由 CPU 和 GPGPU 构成的异构计算平台如下图所示&#xff0c;GP…

开源AI智能名片S2B2C商城小程序:重塑营销一体化新生态,引领未来商业潮流!

在互联网时代&#xff0c;尤其是移动互联网的迅猛发展下&#xff0c;顾客的认知与购买行为发生了翻天覆地的变化。曾经&#xff0c;顾客的认知和购买是两个相对独立的过程&#xff0c;不仅时间不同步&#xff0c;空间上也存在明显的分离。但如今&#xff0c;微信、App、电子商务…

MATLAB中Simulink.SimulationData.Dataset用法

目录 语法 说明 示例 访问使用Dataset格式记录的数据 打开模型vdp 使用 Dataset 对象来组合模拟输入信号 Simulink.SimulationData.Dataset的功能是访问已记录的模拟数据或组合模拟输入数据。 语法 ds Simulink.SimulationData.Dataset ds Simulink.SimulationData.Da…

如何在gitee上创建远程仓库?

登录gitee网站后 填写自己的仓库信息后点击创建 然后来到一个新的界面可以看到自己的仓库地址 这样一个空白的仓库就建立好了 也可以按需选择初始化仓库

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题&#xff0c;今天又一个场景&#xff0c;一个字符串&#xff0c;如果不足11位&#xff0c;则左边补0&#xff0c;补够11位。 先要获取字符串长度&#xff0c;然后计算差多少位&#xff0c;补齐。今天又发现一个Object类型&#xff0c;这个类型有点厉害&#x…