做一道逆波兰表示法题目时,遇到这样一种情况:
Input:["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
Output:12
Expected:22
代码如下:
class Solution:
# @param tokens, a list of string
# @return an integer
def plus(x, y):
return x+y
def minus(x, y):
return y-x
def mult(x, y):
return x*y
def divide(x, y):
if x==0:
exit(1)
else:
return int(y/x)
operator = {"+":plus, "-":minus, "*":mult, "/":divide}
def evalRPN(self, tokens):
res = []
for s in tokens:
if s in "+-*/":
res.append(self.operator.get(s)(res.pop(),res.pop()))
else:
res.append(int(s))
return res.pop()
看到这种输出结果,第一反应就是在浮点数部分处理出现了问题,想到刚刚翻过的《
一维数组转二维数组》中提到python是向下取整的,显然在上述计算中
10 *((6 / (( 9 + 3 ) * -11 ))值为 -1 从而得出12
于是趁机整理下python关于浮点数取整的方法:
1、类型工厂函数,int(),效果:浮点数取整,如int(3.5)就返回3;数字的字符形式转换成数字,如int("35")就返回35
2、内置函数的round(),四舍五入,第二个参数是保留小数点后多少位,默认是0,如round(3.5)返回4.0,round(3.5,1)就返回3.5,不能取整
3、math模块的floor(),取小于等于的整数,如floor(3.5)返回3.0,floor(-1.5)返回-2.0,也不能取整
4、math.ceil方法向上取整
该题目解决方法:
在divide方法中改为 return int(float(y)/x)
LeetCode编译器进行 / 运算结果默认为int类型,需要强制转换为float来运算
在我用的Python3.4版本中,进行 / 运算结果默认为float类型,如果需要int结果同样需要强制转换