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位 整数

二、思路分析

三、代码参考

1、Java

class Solution {public int calculate(String s) {// 创建栈空间Stack<Integer> stack = new Stack<>();// 用来表示正负号,1 为 + , -1 位 - ,默认为正数int sign = 1;// 用来记录运算结果int result = 0;// 循环遍历字符串for(int i = 0; i < s.length(); i++){// 获取当前字符char str = s.charAt(i);     // 判断是否为数字类型if(Character.isDigit(str)){// 通过 - '0' 这个操作把字符转换为整数int value = str - '0';// 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){// i 向后移动i++;// 数字拼接,如// 12 = 1 * 10 + 2// 123 = 12 * 10 + 3value = value * 10 + s.charAt(i) - '0';}// 把获取到的结果赋值给 resultresult = result + sign * value;}       // 如果是 + 符号,则 sign 为 1else if(str == '+'){sign = 1;}// 如果是 - 符号,则 sign 为 -1else if(str == '-'){sign = -1;}// 判断是否是 '('else if(str == '('){// 先把在遇到 '(' 之前的结果放入到栈中stack.push(result);// 然后 result 结果置空,为了等下计算括号里面的结果result = 0;// 再把左括号前面的符号放入到栈中stack.push(sign);// 回归默认值sign = 1;}// 判断是否为 ')'else if(str == ')'){// 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号int symbol = stack.pop();// 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果int stackResult = stack.pop();// 计算结果并将结果赋值给 resultresult = stackResult + symbol * result;}}// 返回结果return result;}
}

2、Python

class Solution(object):def calculate(self, s):# 创建栈空间stack = list()# 用来表示正负号,1 为 + , -1 位 - ,默认为正数sign = 1# 用来记录运算结果result = 0# 初始化 i i = 0# 循环遍历字符串while i < len(s):# 获取当前字符str = s[i]# ' ' 空字符不需要做处理,下一个就好if str == ' ' :i += 1# 判断是否为数字类型elif str.isdigit() :# 把字符类型转换成数字类型value = ord(s[i]) - ord('0')# 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字while i + 1 < len(s) and s[i + 1].isdigit():# i 向后移动i += 1# 数字拼接,如# 12 = 1 * 10 + 2# 123 = 12 * 10 + 3value = value * 10 + ord(s[i]) - ord('0')# 把获取到的结果赋值给 resultresult += value * signi += 1# 如果是 + 符号,则 sign 为 1elif str == '+' :sign = 1i += 1# 如果是 - 符号,则 sign 为 -1elif str == '-' :sign = -1i += 1# 判断是否是 '('elif str == '(' :# 先把在遇到 '(' 之前的结果放入到栈中stack.append(result)# 然后 result 结果置空,为了等下计算括号里面的结果result = 0# 再把左括号前面的符号放入到栈中stack.append(sign)# 回归默认值sign = 1i += 1# 判断是否为 ')'elif str == ')' :# 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号symbol = stack.pop()# 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果stackResult = stack.pop()# 计算结果并将结果赋值给 resultresult = stackResult +  symbol * result i += 1# 返回结果return result

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

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

相关文章

论数据资源持有权(下)

四、数据资源持有权&#xff1a;数据流通体系与秩序运行的支柱 现代数字经济背景下的数据要素市场&#xff0c;主要是在动态的流通中实现数据财产价值&#xff0c;在明确数据资源持有权作为构建数据流通中的新型数据财产产权的基石后&#xff0c;就应该充分围绕数据资源持有权…

微信小程序开发系列-11组件间通信02

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

Web网页开发-初识web-笔记

1.被< >围起来的内容叫做标签 2.DOCTYPE&#xff1a;文件类型 lang:语言 charset&#xff1a;字符集 3.网页中任何效果都需要用标签实现 4.html中不支持回车 5.图片&#xff1a; img:图片标签 src:存放图片的位置 alt&#xff1a;当图片加载不出来时的错误提…

【算法】哈希算法和哈希表

一、哈希算法 哈希算法是一种将任意长度的数据&#xff08;也称为“消息”&#xff09;转换为固定长度字符串&#xff08;也称为“哈希值”或简称“哈希”&#xff09;的数学函数或算法。这个固定长度的字符串是由输入数据通过一系列的运算得到的&#xff0c;并且具有一些重要…

算法通关村第二十关-白银挑战图的存储与遍历

大家好我是苏麟, 今天继续聊图 . 与前面的链表、树等相比&#xff0c;图的存储和遍历要复杂非常多 .所以理解就好 , 面试基本不会让写代码的 . 图的类型多、表示方式多&#xff0c;相关算法也很多&#xff0c;实现又过于复杂&#xff0c;多语言实现难度太大了。这些算法一般理…

C语言之scanf浅析

前言&#xff1a; 当有了变量&#xff0c;我们需要给变量输入值就可以使用scanf函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用printf函数&#xff0c;如&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:");sc…

软件工程总复习笔记

软件工程课程复习提纲 文章目录 软件工程课程复习提纲一、基本知识点1. 软件工程的概念及目标2. 软件危机的概念及典型表现3. 瀑布模型的概念及特点4. 快速原型模型的特点5. 螺旋模型的基本思想6. 软件生命周期的概念及划分为哪几个阶段7. 软件需求的定义8. 常见的软件需求获取…

Java位运算及移位运算

java中能表示整数数据类型的有byte、short、char、int、long&#xff0c;在计算机中占用的空间使用字节描述&#xff0c;1个字节使用8位二进制表示。 数据类型字节数二进制位数表示范围默认值byte18-27 – 27-10char2160 – 216-1\u0000 (代表字符为空 转成int就是0)short216-…

React16源码: ConcurrentMode的使用及源码实现

ConcurrentMode 1 ) 概述 ConcurrentMode 是 React 16 出来的一个最令人振奋的功能在2018年年初是 Async Mode&#xff0c;在发布了16.6之后&#xff0c;名字进行了更新然后改成了 ConcurrentMode&#xff0c;中间的API有一个过渡的版本&#xff0c;后续会提到它其实是 React…

OpenCV-12绘制图像

OpenCV提供了许多绘制图像的API&#xff0c;可以在图像上绘制各种图形&#xff0c;例如直线&#xff0c;矩形&#xff0c;圆&#xff0c;椭圆等图形。 一、画直线 利用API line&#xff08;img, pt1, pt2, color, thickness, lineType, shift&#xff09;可以绘制直线。 其中…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 代码下载(1)

本文主要参考&#xff1a; BQ3588C_代码下载 1. 安装依赖工具 安装命令如下&#xff1a; sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flexbison gperf build-essential zip curl zlib1g-dev gcc-multilib g-multiliblibc6-dev-i386 l…

力扣题目学习笔记(OC + Swift)27.移除元素

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…

【编译原理】期末预习做题向I

新的一年希望可以成为更好的人嘿嘿&#xff01; 这一篇基本就是把 up 讲的题都截了一遍然后加了点自己的笔记啥的 O.o &#xff08;不妥的话会删掉的 qwq&#xff0c;希望没事嘿嘿&#xff09; 来源&#xff1a;混子速成 I. 绪论 记住组成部分 II. 前后无关文法和语言 1.…

Python从入门到网络爬虫、自动化

可以创建C、C#、Python、Golang、Java、React、Node、Vue、PHP项目 创建Java项目 创建Python项目 简单if……else……语句 # 简单的if……else……语句 state True if state:print("状态正常") else:print("状态异常")# 复杂的if……elif……语句 score …

粤港澳个人数据跨境流动规则的理解

文章目录 前言一、港澳数据安全的相关背景二、港澳个人数据跨境流动指引三、香港个人资料跨境规则的梳理与解读在本文中主要做以下解读:四、澳门个人资料跨境规则的梳理与解读五、内地与港澳个人数据跨境监管规定比对1、保护目的2、保护对象和监管对象。3、出境活动和出境条件…

周记-20240101

记录一下最近的生活&#xff0c;做一下简单的梳理&#xff0c;具体详细的梳理等我目前的工作步入正轨 以后再开始好好地总结一下2023年的过往经历&#xff0c;总结过去&#xff0c;展望未来。计划一下未来的2024该怎么度过。 最近一阵子都忙着考试&#xff0c;然后从10号以后一…

一骑绝尘!维乐携手骑行侠客轻风逆旅带你解锁冬日逆旅

是逆风冬旅还是冻旅&#xff1f;冬日似乎都被骑友们默认做事应该闭关闭的时间了&#xff0c;空气中萧瑟的寒风仿佛是穿透我们的骨膜&#xff0c;当我还在路上瑟瑟发抖的时候&#xff0c;此时一位公路骑行侠正在开启他的冬日旅途~      以下是来自他的自诉&#xff1a;   …

saas 多租户系统数据隔离方案

关注WX公众号&#xff1a; commindtech77&#xff0c; 获得数据资产相关白皮书下载地址 1. 回复关键字&#xff1a;数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字&#xff1a;光大银行 下载 光大银行-《商业银行数据资产会计核算研究报告》 3. 回复关键字…

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设&#xff0c;内嵌在NVIC中&#xff0c;叫系统定时器。 当处理器在调试期间被喊停时&#xff0c;SysTick也将暂停运作。 一共有四个寄存器&#xff0c;不过我们通常用前三个&#xff0c;不需要校准。下图出自《STM32F10xxx Cortex…

关于SIC 的Know-how

SiC的分类和用途 根据电阻率不同&#xff0c;SiC衬底晶片可分为导电型和半绝缘型。 SiC衬底晶片主要用来做成高压功率器件和高频功率器件。其中&#xff0c;导电型SiC衬底晶片经过SiC外延后&#xff08;SiC基SiC外延片&#xff09;&#xff0c;主要应用于制造耐高温、耐高压的…