大家好!最近参加了Shopify在多伦多的Tech面试,其中一个环节是算法挑战,题目是LeetCode 224: Basic Calculator。这题可把我卡了一阵子 ,最后终于用Python搞定了,现在来分享一下我的通关秘籍,希望能帮助到各位准备面试的小伙伴们!
首先,LeetCode 224这题,难度不小,它考察的是表达式求值,需要处理括号、加减乘除等多种运算符。单纯的递归或者栈解法都不太容易实现,容易出错。我一开始尝试用递归,结果各种边界条件处理不过来,代码写得又臭又长,最后还是放弃了 。
后来,我参考了一些网上的解法,最终选择了用栈来解决这个问题。具体思路如下:
- 栈的应用: 使用两个栈,一个操作数栈
nums
,一个运算符栈ops
。 - 遍历表达式: 从左到右遍历表达式字符串。
- 数字处理: 遇到数字,将其转换为整数并压入
nums
栈。 - 符号处理: 遇到运算符,需要考虑运算符优先级。如果遇到
(
,直接压入ops
栈;遇到)
,则弹出ops
栈中的运算符,直到遇到(
,然后进行计算并把结果压入nums
栈;遇到+
、-
、*
、/
,则根据优先级,弹出ops
栈中优先级高于或等于当前运算符的运算符进行计算,并将结果压入nums
栈,最后再将当前运算符压入ops
栈。 - 计算结果: 遍历结束后,依次弹出
ops
和nums
栈中的元素进行计算,最终得到结果。
Python代码如下:
def calculate(s):
nums, ops = [], []
num = 0
sign = 1
for char in s:
if char.isdigit():
num = num * 10 + int(char)
elif char in :
nums.append(num * sign)
num = 0
sign = 1
if char == "(":
ops.append(char)
elif char == ")":
while ops and ops != "(":
op = ops.pop()
if op == "+":
nums.append(nums.pop() + nums.pop())
elif op == "-":
nums.append(-nums.pop() + nums.pop())
elif ops and ops in :
if ops == "+":
nums.append(nums.pop() + nums.pop())
elif ops == "-":
nums.append(-nums.pop() + nums.pop())
ops.pop()
ops.append(char)
else:
continue
nums.append(num * sign)
while ops:
op = ops.pop()
if op == "+":
nums.append(nums.pop() + nums.pop())
elif op == "-":
nums.append(-nums.pop() + nums.pop())
return nums
# Example usage
expression = "(1+(4+5+2)-3)+(6+8)"
result = calculate(expression)
print(f"The result of {expression} is: {result}") # Output: 23
这个代码实现比较简洁,也比较好理解。当然,还有其他方法可以解决这个问题,比如使用递归下降解析器,不过我个人觉得栈的方法更适合初学者上手。希望这篇分享能够帮助大家顺利通过Shopify的面试! 加油!