大家好,我是吴师兄。
今天下午有个同学在群里提了一个问题
请问一下为什么在pycharm和lc里面跑出来的结果不一样呀
。
截图如下,一个是 PyCharm 输出的结果。
另外一个是在 LeetCode 上输出的结果。
都是运行同样的代码。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
# 使用一个列表作为栈,存储操作数,从左到右遍历逆波兰表达式
result = []
# 遍历字符串数组
for token in tokens:
# 如果是运算符
if token in "+-*/":
# 先出栈的是右操作数
rightNum = result.pop()
# 后出栈的是左操作数
leftNum = result.pop()
# 计算结果
if token == "+":
ans = leftNum + rightNum
elif token == "-":
ans = leftNum - rightNum
elif token == "*":
ans = leftNum * rightNum
elif token == "/":
ans = int(leftNum / rightNum)
else:
# 转换为数字
ans = int(token)
# 存储结果
result.append(ans)
# 返回栈顶元素
return result[-1]
得到的是两个不同的结果。
如果学过 Python 的程序员肯定可以第一时间得出答案:
问题是两者的不同编译环境导致
。
这段代码在 Python2 和 Python3 中的表现不同,主要原因在于除法操作符
/
的行为差异。在 Python2 中,整数除法使用
/
时会执行整数除法,而在 Python3 中,
/
会执行浮点数除法,
//
则用于整数除法
。
代码中这部分:
elif token == "/":
ans = int(leftNum / rightNum)
在 Python2 和 Python3 中的行为不同:
-
-
leftNum / rightNum
会执行整数除法,如果
leftNum
和
rightNum
都是整数,结果也是整数。
-
int(leftNum / rightNum)
相当于对结果再执行一次整数转换,但由于结果已经是整数,实际上不会改变值。
-
leftNum / rightNum
会执行浮点数除法,结果是浮点数。
-
int(leftNum / rightNum)
会将浮点数结果转换为整数,这相当于向下取整(截断小数部分)。
这就导致了在 Python2 和 Python3 中,除法运算的结果可能不同。要在两个版本中得到一致的行为,可以使用 Python3 的整数除法操作符
//
。
所以只需要把 PyCharm 里面的语言设置为 Python3 ,
问题得到解决
。
经过 4 年时间的迭代,和付费学员们真金白银的支持和反馈后,课程愈发的体系化。
目前大厂算法训练营涵盖如下内容:
0、20 小时的 Python 入门视频课,搭配 4w 字的文档,从搭配环境到 Python 语法内容
1、20 节的基础数据结构动画视频课
2、300 道左右的 LeetCode 动画视频讲解
3、150 道左右的各个互联网大厂笔试真题文字讲解和录播讲解
4、300 道左右的华为 OD 机试真题文字讲解和录播讲解,每周新增 4 题
5、250 场左右的答疑直播课,每周新增一场
结合训练营的内容,星球会提供如下的资源进行学习,相当于是一个缩小版的算法训练营:
0、20 小时的 Python 入门视频课,搭配 4w 字的文档,从搭配环境到 Python 语法内容
1、100 道 LeetCode 算法动画视频讲解,每个视频时长 10 分钟左右,持续更新