2017-08-06 68 views
2
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。我试图检查就行了检查python中的整数溢出

 if(abs(sum) > 2 ** 32): 
      return 0 

但测试用例一个给我:

Input: 1563847412 

Output: 2147483651 

Expected: 0 

首先,我不知道为什么这溢出了,我不知道如何解决这个问题。

谢谢!

+1

最大的32位有符号整数ULL代码是'(1 << 31) - 1',这是2147483647。 –

+0

假设你正在检查符号整数,则需要'ABS(SUM)> 2 ** 31 - 1'(或者更好,abs(sum)>(1 << 31) - 1') –

+1

这段代码比它需要的复杂得多。例如,你可以在一个步骤中反转一个字符串,你不需要'for'循环来完成它。顺便说一句,使用'sum'作为变量名并不是一个好主意,因为它隐藏了内置的'sum'函数。不过这不会伤害任何东西。 –

回答

4

change if(abs(sum) > 2 ** 32): to if(abs(sum) > (2 ** 31 - 1)): or abs(sum) > (1 << 31) - 1):最大的32位有符号整数实际上不是2^32而是(2 ^(31))-1)。因为我们需要作为符号位保留一位。

读到它的为什么数2147483647(或十六进制7FFF,FFFF)为32位的带符号二进制整数

+0

为什么倒投了? –

+0

我不知道为什么......我的答案中有错误吗? –

+0

我想下来选民应该提供合理性为什么? –

1

最大32位带符号整数是(1 << 31) - 1(2**31)-1正的最大值here但不是(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 
0

我猜像下面的一些东西重量轻,也许可以达到同样的逻辑,别人看,主要的溢出检查反转后32位int为

if(abs(n) > (2 ** 31 - 1)): 
        return 0  

F下面

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 
+1

@ErikvonAsmuth好了 – varun