返回
227. 基本计算器 II:只言片语,读懂算法之趣
前端
2024-01-09 12:09:25
今天我们一起来解决 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 的解法。这道题考察了我们对算术运算符优先级的理解、栈和递归的使用,以及对动态规划的掌握程度。希望大家能够通过这道题对这些知识有更深入的理解。