返回

路飞教你刷力扣题:227. 基本计算器 II

前端

路飞教你刷力扣题:227. 基本计算器 II

导读

今天,我们继续刷力扣题,这次的目标是第 227 题:基本计算器 II。这道题要求我们实现一个基本计算器,能够计算给定字符串表达式中的值。

题目

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

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

示例 1:

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

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

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

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 由整数、'+'、'-'、'*' 和 '/' 组成
  • '+'、'-'、'*' 和 '/' 的优先级均相同
  • s 中不会存在括号

解题思路

这道题的解题思路很简单,我们可以使用一个栈来存储计算结果和操作符。

具体步骤如下:

  1. 将字符串 s 中的数字和操作符分别保存到两个列表中。
  2. 遍历操作符列表,对于每个操作符,将栈顶的两个元素弹出,进行计算,然后将计算结果压入栈中。
  3. 重复步骤 2,直到操作符列表为空。
  4. 此时,栈中只剩下一个元素,即计算结果。

代码实现

def calculate(s):
    nums, ops = [], []
    num = 0
    for ch in s:
        if ch.isdigit():
            num = num * 10 + int(ch)
        elif ch in "+-*/":
            nums.append(num)
            ops.append(ch)
            num = 0
    nums.append(num)

    while ops:
        op = ops.pop()
        b, a = nums.pop(), nums.pop()
        if op == '+':
            nums.append(a + b)
        elif op == '-':
            nums.append(a - b)
        elif op == '*':
            nums.append(a * b)
        else:
            nums.append(int(a / b))

    return nums[0]

时间复杂度分析

该算法的时间复杂度为 O(n),其中 n 是字符串 s 的长度。

空间复杂度分析

该算法的空间复杂度为 O(n),其中 n 是字符串 s 的长度。

结语

这道题的难点在于理解题目要求和实现算法。通过这道题,我们学习了如何使用栈来计算表达式。

下一期,我们将继续刷力扣题,敬请期待!

附录

力扣题:227. 基本计算器 II
力扣链接