class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
negative = False
if(x < 0):
x = x * -1
negative = True
else:
x = x
sum = 0
dig = 1
strX = str(x)
lst = list(strX)
for i in lst:
sum += int(i) * dig
dig *= 10
if(abs(sum) > 2 ** 32):
return 0
elif(negative == True):
return sum * -1
else:
return sum
这是一个leetcode问题,要求我们反转一个整数。我知道它是一个脏代码,但它仍然有效,但当反向整数溢出时它不会返回0。我试着在线上检查
if(abs(sum) > 2 ** 32):
return 0
但其中一个测试用例告诉我:
Input: 1563847412
Output: 2147483651
Expected: 0
首先,我不确定为什么会溢出,我不知道如何解决这个问题。
谢谢!
答案 0 :(得分:15)
将if(abs(sum) > 2 ** 32):
更改为if(abs(sum) > (2 ** 31 - 1)):
或abs(sum) > (1 << 31) - 1):
最大的32位有符号整数实际上不是2 ^ 32而是(2 ^(31)) - 1)。因为我们需要一位保留作为符号位。
了解原因here为什么数字2,147,483,647(或十六进制7FFF,FFFF)是32位有符号二进制整数的最大正值
答案 1 :(得分:2)
我猜有些像下面那样重量轻的东西也许可以实现相同的逻辑,对于其他人来说,反转32位int之后的主要溢出检查是
if(abs(n) > (2 ** 31 - 1)):
return 0
以下完整代码
def reverse(self, x):
neg = False
if x < 0:
neg = True
x = x * -1
s = str(x)[::-1]
n = int(s)
if neg:
n = n*-1
if(abs(n) > (2 ** 31 - 1)):
return 0
return n
答案 2 :(得分:1)
最大的32位有符号整数是(1 << 31) - 1
,(2**31)-1
但不是(2**32)
。
尝试这种方式:
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
negative = False
if (x < 0):
x = x * -1
negative = True
else:
x = x
sum = 0
dig = 1
strX = str(x)
lst = list(strX)
for i in lst:
sum += int(i) * dig
dig *= 10
if (abs(sum) > ((1 << 31) - 1)): #use (1 << 31) - 1) instead of 2 ** 32
return 0
elif (negative == True):
return sum * -1
else:
return sum
if __name__ == '__main__':
x = 1563847412
sol = Solution().reverse(x)
print(sol)
输出
0
答案 3 :(得分:1)
class Solution:
def reverse(self, x: int) -> int:
split = [i for i in str(x)]
split = split[::-1]
final = ''
if split[-1]=='-':
final += '-'
for i in split[0:-1]:
print(i)
final+=i
else:
for i in split[0:]:
final+=i
final = int(final)
if(abs(final) > (2 ** 31 - 1)):
return 0
return(final)
答案 4 :(得分:0)
您可以简单地使用:
if sum >= pow(2,31)-1:
return 0
答案 5 :(得分:0)
if sum > ((1 << 31) - 1):
return 0
else:
if negative == True:
sum = -sum
return sum