华为od技术面python 手撕代码
时间: 2025-02-18 22:51:06 浏览: 48
### 华为OD Python 技术面试常见手撕代码题目及解答
#### 逆波兰表达式求值
对于给定的逆波兰表示法(Reverse Polish Notation, RPN),编写函数计算其数值。
```python
def evalRPN(tokens):
res = []
for i in tokens:
if i == "+":
a = res.pop()
b = res.pop()
res.append(b + a)[^1]
elif i == "-":
a = res.pop()
b = res.pop()
res.append(b - a)
elif i == "*":
a = res.pop()
b = res.pop()
res.append(b * a)
elif i == "/":
a = res.pop()
b = res.pop()
if (a > 0 and b < 0) or (a < 0 and b > 0):
res.append(abs(b) // abs(a) * (-1))
else:
res.append(b // a)
else:
res.append(int(i))
return res[-1]
```
该算法利用栈来处理操作数和运算符。遇到数字则压入栈中;遇到运算符,则弹出两个最近的操作数执行相应运算,并将结果重新压回栈顶。最终栈内仅剩下一个元素即为所求的结果。
时间复杂度分析表明,此方法遍历一次输入列表中的每一个token,在最坏情况下每个token都需要进行常量时间内完成的一系列操作(如加减乘除)。因此整体时间复杂度为O(n),其中n代表tokens的数量。
空间复杂度方面,由于使用了一个额外的数据结构——栈来存储中间结果以及待处理的操作数,所以所需的空间大小取决于表达式的长度及其嵌套程度。理想状态下,当所有的操作都是连续的二元运算时,最多只需要保存一半数量级的操作数于栈上等待匹配相应的右操作数参与计算过程。故而平均情况下的空间开销大约也是线性的,记作O(m),这里m指的是实际存放在res数组里的最大数目。
阅读全文
相关推荐















