2017-06-16 90 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