2017-06-16 93 views
2

我正试图解决leetcode.com中的一个练习,它涉及signed 32bit integers反向32位整数

的任务是:

返回签署的32位整数的倒数,并返回0,如果它溢出了32位有符号整数的范围。

Wikipedia

一个32位寄存器可存储32个不同的值。可以存储在32位中的整数 值的范围取决于所使用的整数 表示形式。对于两个最常见的表示, 范围为0到4,294,967,295(2^32 - 1),表示为 (无符号)二进制数,-2,147,483,648(-2^31)到 2,147,483,647(2^31 - 1 )表示为二的补码。

所以,如果我的理解是正确的,我应该间隔0 to (2^31)-1(-2^31) to 0之间的测试,否则,返回0

这里是我的代码:

def reverse_int(nums): 
    a = str(nums) 

    if 0 < nums <= (1 << 31)-1: 
     return int(a[::-1]) 

    elif (-1 << 31) <= nums < 0: 
     return -(int(a[:-len(a):-1])) 
    else: 
     return 0 

这里是我的问题: 当我测试用的网站上我的代码:

nums = 1534236469 # Fail 
nums = 1463847412 # Success 
nums = 9000000 # Success 

为什么我当前的代码失败,1534236469?是不是1534236469的范围是32 bit signed integers?我错过了什么?

+0

你会得到什么输出失败的情况? – Zeokav

+0

例如,对于网站上的'1534236469',它应该返回0.这意味着'1534236469'溢出了32位有符号整数的范围。 –

+1

但它不溢出。 – Zeokav

回答

6

正如在评论中提到的,你必须第一个反转然后检查。然而,这是一种不同的检查方式。

检查你可以只用&结果与适当的面具。

所以你的情况的限制是−2,147,483,6482,147,483,647他们的十六进制值-0x800000000x7fffffff

在解释试试这个。

>>> 0x7fffffff 
2147483647 
>>> 2147483647 & 0x7fffffff #within limit 
2147483647 

超出限制的数值,可以看到显示的其他数值。

>>> 2147483648 & 0x7fffffff  #Exceeds limit 
0 
>>> 98989898989898 & 0x7fffffff #Exceeds limit 
1640235338 

但当值范围内。该值以输出形式给出。

>>> 1 & 0x7fffffff    #within limit 
1 
>>> 780 & 0x7fffffff 
780 

对于负值

>>> -0x80000000  #Limit 
-2147483648 
>>> -2147483648 & -0x80000000 
-2147483648 

当该值的范围内。作为输出给出限制

>>> -2147483647 & -0x80000000 
-2147483648 
>>> -2 & -0x80000000   #within limit 
-2147483648 
>>> -2323 & -0x80000000 
-2147483648 

但是,如果值超出范围,您可以看到显示其他值。

>>> -2147483649 & -0x80000000 
-4294967296 
>>> -999999999999 & -0x80000000 
-1000727379968 

你可以利用这个很好,很好,得到你想要的!

这是一个可以做你想做的事情的程序。

def reverse(x): 
    str_x = str(x) 
    if x<0: 
     str_x = '-'+str_x[::-1][:-1] 
     x = int(str_x) 
    else: 
     str_x = str_x[::-1] 
     x = int(str_x) 
    neg_limit= -0x80000000 
    pos_limit= 0x7fffffff 

    if(x<0): 
     val=x&neg_limit 
     if(val==neg_limit): 
      return x 
     else: 
      return 0 
    elif(x==0): 
     return x 
    else: 
     val = x&pos_limit 
     if(val==x): 
      return x 
     else: 
      return 0 

value = int(input("Enter value: ")) 
print(reverse(value)) 

下面的部分只是反转正负值。

if x<0: 
    str_x = '-'+str_x[::-1][:-1] 
    x = int(str_x) 
    print(x) 
else: 
    str_x = str_x[::-1] 
    x = int(str_x) 
    print(x) 

设定的极限neg_limit= -0x80000000pos_limit= 0x7fffffff,并根据所解释的逻辑检查它们。

+1

或者,如果在'(-1 << 31)'和'(1 << 31)-1'之间,则以比较简单的方式比较'str_x'的反转'int'。如果不返回'0'。顺便说一下,你的方法也是正确的,但是太冗长了。 –

+2

是的,但是想要提及使用'&'并使用'mask' – void