计算器(字符串表达式求值): 力扣 224.基本计算器I 227.基本计算器 进阶版本

本文主要介绍了如何解决LeetCode中的224.基本计算器I和227.基本计算器II问题。通过递归方法处理字符串表达式,涉及加减乘除及括号运算,解析过程中先处理乘除法,再处理加减法,实现计算结果的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

给定一个字符串 str,str 表示一个表达式,其中只可能有整数、空格、加减乘除符号和左右括号,整数除法仅保留整数部分,返回公式的计算结果。

【举例】
str="48*((70-65)-43)+8*1",返回-1816。
str="3+1 *4",返回 7。
str="3+ (1*4)",返回 7。
【说明】
1.可以认为给定的字符串一定是正确的表达式,即不需要对 str 做公式有效性检查。
2.如果是负数,就需要用括号括起来,比如"4*(-3)"。但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如"-3*4"和"(-3*4)"都是合法的。
3.不用考虑计算过程中会发生溢出的情况。

说在前面的话

1.题目和解法均来源于算法精讲直播-左程云,课程中讲解的极其清楚明白,收获良多,此博客只为记录学习。
2.Leetcode中也有类似题目,但都是此题的简单版本,也推荐去学习,链接如下:224.基本计算器I 227.基本计算器II


题解分析

首先,让我们抛开题目本身,把这个问题简单化,来考虑最简单的一种情况,那就是字符串是正确的表达式,而且式子中只包含加号[+]、减号[-]和数字,如:3+5-7+6-45-68+23,这种表达式我们肯定都会做,只需遍历一遍就可以得出最终答案。若复杂一点,负号在最前面:-3+5-7+6-45-68+23,我们只需在最前面填一个0,认为是0减去后面的式子,就可以得出结果。接着,我们进一步思考,若式子中再增加符号乘【*】和除【/】,如:3*5-7/6-45-68+23,这样的式子可以先把乘除法的部分看作一个整体,先计算转换为15-1-45-68+23再用之前的方法进行解决。最后,就到了加入括号的部分了,括号会打破原有的秩序,因为它会改变运算优先级,而且会存在括号嵌套,这就是这道题的难点。遇到嵌套的问题我们一般会想到递归解决,这道题通过递归就可以方便的解决括号存在的问题。
直接叙述较为空洞,结合代码我们来说下思路。

class Solution:
 def calculate(self, s: str) -> int:
     s = s.replace(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值