欢乐力扣:基本计算器

文章目录


1、题目描述

基本计算器

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

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

2、思路

本人也不太会,看的这个人的讲解视频:bibili.

代码

python 复制代码
class Solution:
    def calculate(self, s: str) -> int:
        ret = 0  # 记录结果
        num = 0  # 记录当前数字
        sign = 1 # 记录当前符号
        for char in s:
            # 如果碰到数字:比如134,则不断更新num的数值
            if char<= '9' and char >= '0': 
                num = num*10 + int(char)     
            # 如果碰到加号或者减号,则更新一遍ret,同时将符号位和num重置;
            elif char == '+':
                ret = ret + num*sign 
                sign = 1 
                num = 0
            elif char == '-':
                ret = ret + num*sign 
                sign = -1
                num = 0 
        return ret+num*sign  

括号

若包含括号,则需要用到栈:

python 复制代码
class Solution:
    def calculate(self, s: str) -> int:
        ret = 0  # 记录结果
        num = 0  # 记录当前数字
        sign = 1 # 记录当前符号
        stack = []  # 记录括号
        for char in s:
            # 如果碰到数字:比如134,则不断更新num的数值
            if char<= '9' and char >= '0': 
                num = num*10 + int(char)  
            # 如果碰到加号或者减号,则更新一遍ret,同时将符号位和num重置;
            elif char == '+':
                ret = ret + num*sign 
                sign = 1 
                num = 0
            elif char == '-':
                ret = ret + num*sign 
                sign = -1
                num = 0 
            # 若碰到左括号,则入栈res和当前符号:
            elif char == '(':
                stack.append(ret)
                stack.append(sign)
                num = 0
                sign = 1 
                ret = 0      # 千万记得这里吧ret也需要置为0,否则就累加了。
            elif char == ')':
                ret = ret + num*sign
                num  = 0 
                sign = 1
                # 更新ret的符号位
                ret *= stack[-1]
                stack.pop()
                # 更新ret的值
                ret += stack[-1]
                stack.pop()
        return ret+num*sign   # 返回最终的值
相关推荐
AI软著研究员1 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱3 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者19 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮19 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者19 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考20 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法