使用Python 2.7
我试图解决LeetCodeOJ上的反向波兰表示法问题。
我用Python编写了我直截了当的解决方案:
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
stack = []
for token in tokens:
if token in ["+" , "-" ,"*", "/"]:
op1 = stack.pop()
op2 = stack.pop()
if token == "+":
stack.append(op2+op1)
elif token == "-":
stack.append(op2-op1)
elif token == "*":
stack.append(op2*op1)
elif token == "/":
stack.append(op2/op1)
else:
stack.append(int(token))
if len(stack) == 1:
return stack.pop()
else:
return 0
在测试用例中被拒绝:
Input: ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output: 12
Expected: 22
但如果我将'/'
操作的应用修改为stack.append(int(op2 / (op1*1.0)))
,则会成功。
在此输入计算/
上执行6/-132
次操作,这会导致-1
使用两种方式之一。
奇怪的是,尽管两个评估结果都是-1
,但整个程序的输出结果不同。如上所示,使用第一种方式会将12
作为RPNEval,而使用第二种方式会得到22
。
是什么原因造成的?
我访问了此link,但它只是说Python和C ++中的/
运算符存在一些差异。有什么不同?
答案 0 :(得分:3)
如果您使用的是Python 2,/
会进行整数除法(意思是,它会删除余数并只给出向下舍入的结果),除非至少有一个操作数是类型float
而不是int
。您可以通过乘以1.0
来解决此问题,但您也可以在其中一个操作数上调用float(...)
。这与C ++类似,但是,在C ++中,结果将舍入为零而不是 down ,这意味着您将使用一个否定操作数接收不同的结果:
1 / 2 // gives 0
(-1) / 2 // also gives 0
1 / 2 # gives 0
(-1) / 2 # gives -1 (-0.5 rounded down)
在Python 3上,/
总是进行正确的浮点除法,这意味着你总是得到float
,你可以使用//
来恢复旧的行为
1 / 2 # gives 0.5
(-1) / 2 # gives -0.5
1 // 2 # gives 0
(-1) // 2 # gives -1
由于你使用的是Python 2.7(参见编辑过的问题),它确实似乎是你所坚持的整数除法。要在Python 2中获得新的Python 3样式行为,您还可以运行
from __future__ import division
在你的程序的开头(它必须在一开始,否则翻译会抱怨)
int(something)
请注意,当整数除法舍入 down 时,转换为整数舍入朝零,就像C ++中的整数除法一样。
答案 1 :(得分:1)
Python /
和C ++ /
之间只有两个主要区别。
首先,对于负数,Python向负无穷大方向发展; C ++向0舍入。因此,-10 / 3
在Python中为-4,在C ++中为-3(通常)。
其次,在Python 3.x或带有from __future__ import division
的Python 2.x中,使用/
跳过两个整数会得到float
,因此9 / 3
为3.0 in Python 3.x,但在C ++或Python 2.x中为3。
那么,如果你想在Python中进行C ++样式划分呢?好吧,int
函数总是向0舍入,而不是负无穷大。因此,如果你强制它进行浮点除法,那么在结果上调用int
,而不是让它进行整数除法,你将得到与C ++相同的结果。这就是您链接的代码使用int(b/(a*1.0))
的原因。我不确定这是写这个的最佳方式(特别是没有评论解释重点是什么),但这就是它的用途。
与此同时,如果您真的想知道为什么会有所不同,请尝试在调试器或在线可视化工具中运行代码,或者只在eval循环的每一步添加print
次调用。然后,您可以确切地看到出现错误的步骤 - 参数是什么,输出是什么,以及您对输出的期望。然后,您可以将问题简化为更简单的问题,例如:
a = 4
b = -13
print(b/a)
print(int(b/(a*1.0)))
然后找出为什么会有所不同,将int(b/(a*1.0))
分解为步骤:
print(a*1.0)
print(b/(a*1.0))
print(int(b/(a*1.0)))
答案 2 :(得分:0)
在C ++中,如果划分两个整数,则得到一个整数,舍入为零。例如,
1 / 2 = 0
-1 / 2 = 0
但是如果至少有一个参数是浮点数,那么结果就是浮点数。 在python2中,对于整数参数/将进行整数除法,向下舍入,例如
1 / 2 = 0
-1 / 2 = -1
在python3中,他们改变了/的行为,而不是总是进行浮点除法
1 / 2 = 0.5
如果你想在python3中进行整数除法,你可以使用//运算符
1 // 2 = 0
-1 // 2 = -1