使用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
Run Code Online (Sandbox Code Playgroud)
这在测试用例中被拒绝:
Input: ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output: 12
Expected: 22
Run Code Online (Sandbox Code Playgroud)
但如果我将操作的应用修改'/'为stack.append(int(op2 / (op1*1.0))),它就会成功。
该/操作在此输入计算上执行一次6/-132,导致-1使用两种方式中的任何一种。
奇怪的是,尽管两个评估的结果都是-1,但整个程序的输出却不同。如上所示,使用第一种方式给出12RPNEval,而使用第二种方式给出22。这是什么原因造成的?
我访问了这个链接/,但它只说Python和C++中的运算符存在一些差异。有什么不同?
如果您使用的是 Python 2,/则进行整数除法(也就是说,它会删除余数并只给出向下舍入的结果),除非至少有一个操作数的类型float不是int. 您可以通过乘以 来解决此问题1.0,但您也可以调用float(...)其中一个操作数。这与 C++ 类似,但是,在 C++ 中,结果向零舍入而不是向下舍入,这意味着您将通过一个负操作数收到不同的结果:
1 / 2 // gives 0
(-1) / 2 // also gives 0
Run Code Online (Sandbox Code Playgroud)
1 / 2 # gives 0
(-1) / 2 # gives -1 (-0.5 rounded down)
Run Code Online (Sandbox Code Playgroud)
在Python 3上,/总是进行正确的浮点除法,这意味着你总是得到一个float返回值,你可以用它//来恢复旧的行为
1 / 2 // gives 0
(-1) / 2 // also gives 0
Run Code Online (Sandbox Code Playgroud)
由于您使用的是Python 2.7(请参阅编辑后的问题),因此您似乎确实陷入了整数除法的困境。要在 Python 2 中获得新的 Python 3 风格的行为,您还可以运行
from __future__ import division
Run Code Online (Sandbox Code Playgroud)
在程序的开头(必须在最开始,否则口译员会抱怨)
int(something)请注意,整数除法向下舍入,而整数转换则向零舍入,就像 C++ 中的整数除法一样。
| 归档时间: |
|
| 查看次数: |
2731 次 |
| 最近记录: |