返回

227. 基本计算器 II:只言片语,读懂算法之趣

前端

今天我们一起来解决 LeetCode 上的第 227 题「基本计算器 II」。这道题要求我们实现一个基本计算器,并计算给定数学表达式的值。

这道题考察了我们对算术运算符优先级的理解、栈和递归的使用,以及对动态规划的掌握程度。下面我们就来逐一分析这三个方面。

首先,我们需要理解算术运算符的优先级。在数学中,乘除运算的优先级高于加减运算。因此,我们在计算表达式时,需要先进行乘除运算,再进行加减运算。

其次,我们可以使用栈来存储运算符和操作数。当我们遇到一个运算符时,我们将它压入栈中。当我们遇到一个操作数时,我们将它压入栈中。当我们遇到一个右括号时,我们将栈顶的运算符和操作数取出,进行运算,并将结果压入栈中。

最后,我们可以使用递归或动态规划来计算表达式的值。递归的方法是,我们先将表达式拆分成子表达式,然后递归地计算子表达式的值。动态规划的方法是,我们先创建一张表格,表格中存储着每个子表达式的值。然后,我们从左到右遍历表达式,并根据运算符和操作数来计算每个子表达式的值。

下面我们来看一个 Python 代码示例:

def calculate(s):
    stack = []
    num = 0
    op = '+'
    for i, ch in enumerate(s):
        if ch.isdigit():
            num = num * 10 + int(ch)
        if ch in '+-*/' or i == len(s) - 1:
            if op == '+':
                stack.append(num)
            elif op == '-':
                stack.append(-num)
            elif op == '*':
                stack.append(stack.pop() * num)
            elif op == '/':
                stack.append(int(stack.pop() / num))
            op = ch
            num = 0
    return sum(stack)

print(calculate("3+2*2"))  # 7
print(calculate(" 3/2 "))  # 1
print(calculate(" 3+5 / 2 "))  # 5

这个代码首先将表达式拆分成子表达式,然后使用栈来存储运算符和操作数。当遇到右括号时,代码将栈顶的运算符和操作数取出,进行运算,并将结果压入栈中。最后,代码返回栈中所有元素的和。

这就是 LeetCode 227. 基本计算器 II 的解法。这道题考察了我们对算术运算符优先级的理解、栈和递归的使用,以及对动态规划的掌握程度。希望大家能够通过这道题对这些知识有更深入的理解。