首页 > 其他分享 >LeetCode【0227】基本计算器 II

LeetCode【0227】基本计算器 II

时间:2024-11-25 22:03:28浏览次数:11  
标签:遍历 数字 压入 sign II num LeetCode 0227 stack

本文目录

1 中文题目

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

整数除法仅保留整数部分。

可以假设给定的表达式总是有效的。所有中间结果将在 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31} - 1] [−231,231−1] 的范围内。

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

示例:

输入:s = "3+2*2"
输出:7
输入:s = " 3/2 "
输出:1
输入:s = " 3+5 / 2 "
输出:5

提示:

  • 1 ≤ s . l e n g t h ≤ 3 ∗ 1 0 5 1 \leq s.length \leq 3 * 10^5 1≤s.length≤3∗105
  • s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [ 0 , 2 31 − 1 ] [0, 2^{31} - 1] [0,231−1] 内
  • 题目数据保证答案是一个 32-bit 整数

2 Python求解

2.1 求解思路

通过一个栈保存中间结果,处理四种运算符的优先级问题。对于加减法操作,将当前数字直接(或取相反数)压入栈;对于乘除法操作,弹出栈顶元素与当前数字计算后再压入栈。这样的处理方式确保了乘除法优先于加减法。最后,将栈中所有元素相加得到最终结果。

2.2 涉及方法

  • 栈(Stack):用栈存储中间结果,解决加减法和乘除法的优先级问题。
  • 模拟运算解析:通过一次遍历逐步解析字符串中的数字和操作符,动态计算中间结果。
  • 整数除法向零取整:使用 Python 的 int() 强制截断实现对负数的向零取整(如 -3 / 2 = -1 而不是 -2)。

2.3 求解示例

输入:s = "3+2*2"

初始化:
stack = [], num = 0, sign = '+'
遍历字符 s[0] = '3':
是数字,num = 3.

遍历字符 s[1] = '+':
是操作符,根据当前的 sign = '+',将 num = 3 压入栈:
stack = [3]
更新 sign = '+', 重置 num = 0.

遍历字符 s[2] = '2':
是数字,num = 2.

遍历字符 s[3] = '*':
是操作符,根据当前的 sign = '+',将 num = 2 压入栈:
stack = [3, 2]
更新 sign = '*', 重置 num = 0.

遍历字符 s[4] = '2':
是数字,num = 2.

遍历结束(i = len(s) - 1):
根据当前的 sign = '*',弹出栈顶 2,与 num = 2 相乘后压入栈:
stack = [3, 4]

计算结果:
栈中所有元素求和:3 + 4 = 7.

2.4 Python代码

class Solution:
    def calculate(self, s: str) -> int:
        """
        计算一个只包含非负整数、加法、减法、乘法和除法的字符串表达式的值。
        :param s: 包含数字、'+', '-', '*', '/', 和空格的字符串
        :return: 表达式的计算结果
        """
        # 初始化栈,用于存储操作数
        stack = []
        # 当前数字
        num = 0
        # 当前操作符,初始为加号
        sign = '+'
        # 遍历字符串
        for i, char in enumerate(s):
            if char.isdigit():
                # 如果当前字符是数字,逐位更新当前数字
                num = num * 10 + int(char)
            # 如果遇到操作符,或者是最后一个字符,处理前面的数字
            if char in "+-*/" or i == len(s) - 1:
                if sign == '+':
                    # 加号操作,将当前数字压入栈
                    stack.append(num)
                elif sign == '-':
                    # 减号操作,将当前数字的相反数压入栈
                    stack.append(-num)
                elif sign == '*':
                    # 乘法操作,将栈顶元素与当前数字相乘,并更新栈顶
                    stack.append(stack.pop() * num)
                elif sign == '/':
                    # 除法操作,将栈顶元素与当前数字相除,并更新栈顶
                    # 注意:Python 中负数除法向零取整需要使用 int() 强制截断
                    stack.append(int(stack.pop() / num))
                # 更新操作符为当前字符,重置当前数字
                sign = char
                num = 0
        # 栈中所有元素求和即为最终结果
        return sum(stack)

2.5 复杂度分析

  • 时间复杂度:
    该算法的时间复杂度为 O(n),其中 n 是字符串的长度。每个字符只被遍历一次,且栈的操作(入栈、出栈)均为 O(1)。
  • 空间复杂度:
    该算法的空间复杂度为 O(n),在最坏情况下(如所有运算符都是加减法)需要将所有数字压入栈,栈的空间需求与输入字符串的长度成正比。

3 题目总结

题目难度:中等
数据类型:字符串
数据结构:栈
应用算法:栈的特性

标签:遍历,数字,压入,sign,II,num,LeetCode,0227,stack
From: https://blog.csdn.net/qq_32882309/article/details/144028003

相关文章

  • LeetCode 67 --- 二进制求和
    voidreverse(char*a,intn){inti=0;intj=n-1;chartmp;while(i<j){tmp=a[i];a[i]=a[j];a[j]=tmp;i++;j--;}}char*addBinary(char*a,char*b){intm=strlen(a);......
  • 【leetcode100】找到字符串中所有字母异位词
    1、题目描述给定两个字符串s和p,找到s中所有p的异位词异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。示例1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"的异位词。起始索引等于6的子串是......
  • LeetCode24 两两交换链表中的节点
    LeetCode24两两交换链表中的节点题目链接:LeetCode24描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例输入:head=[1,2,3,4]输出:[2,1,4,3]思路代码classSolution{publicListNodeswapPairs(ListNodehead){ListNodedummy=......
  • 代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝
    学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路图论并查集prim算法kruskal算法学习记录:108.冗余连接点击查看代码#并查集解法classUnionFind:def__init__(self,size):self.parent=list(range(size+1))deffind(se......
  • leetcode - 743
    网络延迟时间迪杰斯特拉的朴素算法流程:邻接矩阵的方法点击查看代码classSolution{publicintnetworkDelayTime(int[][]times,intn,intk){//初始化一些必要参数intINF=Integer.MAX_VALUE/2;int[][]g=newint[n][n];......
  • LeetCode19 删除链表的倒数第 N 个结点
    LeetCode19删除链表的倒数第N个结点题目链接:LeetCode19描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]思路定义fast指针和slow指针,初始值为虚拟头结点fast首先走n+1步fast和slow同时移动,直......
  • 0x03 Leetcode Hot100 双指针
    总结移动零一前一后。前面的遍历数组,后面的维护条件,后指针对值的修改不会影响前指针的遍历。盛最多水的容器一左一右。每次移动一个指针计算当前结果。三数之和一左一右。需要考虑的点:如何去重。接雨水对双指针缺乏练习,还没想到如何同时维护当前位置左右两边最高的点,搁置......
  • LeetCode 1837[K进制表示下的各位数字总和]
    题目链接LeetCode1837[K进制表示下的各位数字总和]详情实例提示题解思路进制转换,遍历求和代码classSolution{public:intsumBase(intn,intk){intiSum=0;while(n>0){iSum+=n%k;......
  • leetcode240
    leetcode240思路:我们将矩阵逆时针旋转45度,可以发现矩阵变成了一个二叉搜索树,往左走是小,往右走是大。这样就能以matrix[0][j]为根开始搜索。classSolution{//10:20~10:28publicbooleandoSearch(int[][]matrix,inti,intj,inttarget){if(i>=matrix.......
  • Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着儿童娱乐与教育需求的日益增长,玩具市场呈现出蓬勃......