使用Python2.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
这在测试用例中被拒绝:
^{pr2}$但是如果我将'/'
操作的应用程序修改为stack.append(int(op2 / (op1*1.0)))
,它就成功了。在
在这个输入计算/
上执行一次6/-132
操作,结果是使用两种方法中的任何一种。在
奇怪的是,尽管两个计算结果都是-1
,但程序作为一个整体,其输出是不同的。如上所示,使用第一种方法将12
作为RPNEval,而使用第二种方法将得到22
。
是什么原因造成的?在
我访问了这个link,但它只表示在Python和C++中^ {< CD3>}运算符有一些不同。有什么区别?在
如果您使用python2,}类型。通过与
/
执行整数除法(也就是说,它去掉余数,只给出向下取整的结果),除非至少有一个操作数是float
而不是{1.0
相乘来修复此问题,但也可以对其中一个操作数调用float(...)
。这与C++类似,但是C++中,结果是“0”,而不是>EME>,意味着你将得到不同的结果,其中一个负操作数:C++:
Python 2:
^{pr2}$Python 3:
在Python3上,
/
总是执行正确的浮点除法,这意味着您总是得到一个float
的返回,您可以使用//
来恢复旧的行为编辑后添加:
由于您使用的是Python2.7(请参阅编辑后的问题),因此它似乎确实是您所坚持的整数除法。要在python2中获得新的python3风格的行为,还可以运行
在程序的开始处(必须在最开始,否则口译员会抱怨)
关于
int(something)
谨防整数除法< EM >向下EEE>,转换为整数圆零,如C++中的整数除法。在
介于Python ^ {CD1>}和C++ +{}之间有两个主要区别。在
首先,对于负数,Python向负无穷大旋转;C++向0轮旋转。因此,^ {CD3}}在Python中为-4,在C++中为-3(通常)。在
第二,在Python 3 .x或Python 2 .x中,^ ^},跳转的两个整数与{{CD1>}给你一个^ {CD6>},所以^ {{CD7}}在Python 3 .x中为3,但是在C++或Python 2中为3。
那么,如果你想在Python中使用C++风格划分呢?那么,
int
函数总是向0取整,而不是负无穷大。因此,如果强制它执行浮点除法,则调用结果上的{{ CD8}},而不是将其放在整数除法中,将得到与C++相同的结果。这就是您链接到的代码使用int(b/(a*1.0))
的原因。我不确定这是写这篇文章的最佳方式(尤其是没有任何评论来解释要点),但这就是它的目的。在同时,如果您真的想知道为什么会不同,可以尝试在调试器或在线可视化工具中运行代码,或者在eval循环的每个步骤添加
print
调用。然后你就可以准确地看到在哪一步出错了,参数是什么,输出是什么,以及你期望的输出是什么。然后您可以将问题简化为更简单的问题,例如:然后要想弄清楚这些不同的原因,请将
^{pr2}$int(b/(a*1.0))
分解为以下步骤:但是如果至少有一个参数是浮点的,那么结果就是浮点。 在python2中,对于整型参数/将执行整数除法,例如向下取整
^{pr2}$在python3中,它们改变了/的行为,但它并不总是进行浮点除法
如果要在python3中使用整数除法,可以使用//operator
相关问题 更多 >
编程相关推荐