7. Reverse Integer

【题目】

Given a 32-bit signed integer, reverse digits of an integer.

給定一個 32 位有符號整數,將整數中的數字進行反轉。

Example 1:

Input:
 123

Output:
 321

Example 2:

Input:
 -123

Output:
 -321

【思路】

很簡單很簡單的題目,反轉數字,

但在解題前先釐清下列幾點就可以解決:

1:10 and -10 ,確認反轉答案為 1 及 -1 即可在前面先判斷減少時間

2:負數的問題,程式語言的不同可能會造成問題,所以負數也要考慮,如果不確定前面先轉正就不會有問題了

3:32 Bit 整數溢出的問題,最大值為 2,147,483,647;也就是十六進位 0x7FFFFFFF,這邊要注意程式語言的不同也會有問題,

像是JAVA值會溢出變奇怪,Python不會,這樣就變成兩邊判斷方式有差異辣。

【解法】

☆JAVA

class Solution {
    public static int reverse(int x) {
        int result = 0;
        if(x == 10){return 1;}
        while(x!=0){
            int tail = x % 10;                             //假設 輸入值是 123    第一次 tail = 3 , 第二次 tail = 2 , 第三次 tail = 1
            int newResult = result * 10 + tail;            //假設 輸入值是 123   newResult 第一次為 0*10+3 = 3 , 第二次為 3*10+2 = 32 , 第三次為 32*10+1 = 321
            if((newResult-tail)/10 != result ){return 0;}  //判斷溢出,檢核計算後值是否相同,因為Java如果值溢出會壞掉 Ex:964632435*10 會變成 1056389758 
            result = newResult;                            // 0 > 3 > 32 > 321
            x = x / 10;
        }
        return result;
    }
}

☆Python

Tips: Python中如果用 / 去除 會有小數點 , 用 // 則會整除

1534 / 10  # 153.4
1534 // 10 # 153
1534 % 10  # 4

Tips: 正負數的取餘數,頭痛的來了,Python算餘數的方式跟別人不一樣 (自己整理出來的 如果有錯請糾正 )

一般程序是用: Truncated Division

可是Python用: Floored Division

看下列範例比較好懂,如果要更詳細的說明可以看下方連結,這邊就不探討了。

(-17) mod 5

答案一: (-17) = (-3)*5 + (-2),所以餘數是 -2 。 # Truncated Division 

答案二: (-17) = (-4)*5 + (+3),所以餘數是 +3 。 # Floored Division

Reference:

#詳細說明
https://goo.gl/A2FjN8
https://goo.gl/LqBwES
#範例
https://goo.gl/fSGgoG
class Solution:
def reverse(x):
    nFlag = False;                                   #負數判斷
    result = 0;
    if(x<0):
        nFlag = True;
        x = abs(x);                                  #轉正數
    if(x == 10): return -1 if nFlag else 1 ;       
    while(x != 0):
        newResult = ( result * 10 ) + ( x % 10);
        xxx = (newResult - (x % 10) ) // 10;
        result = newResult;
        x = x // 10;
    if (result >= 0x7fffffff): return 0;            # 判斷溢出 如果輸出值大於溢出值 則 Return 0
    return -result if nFlag else result ;           # 每個Return都有做負數判斷

但下列我在LeetCode裡面看到比較厲害的解法,可以參考看看

像他這樣是用陣列的概念去實現反轉,也就是說假設輸入值是 54321,

他先轉陣列 變成 [5,4,3,2,1] ,然後反轉從後面開始 [::-1] 並輸出 ,就會回傳 12345 了

處理負數的地方也很漂亮,判斷為負數後先轉正並執行上述動作後再轉負數 * -1 即可

最後在統一判斷回傳值是否大於 溢出值 即可。

class Solution:
    def reverse(self, x):
        if x < 0:
            y = -1 * int(str(-x)[::-1])
        else:
            y = int(str(x)[::-1])  

        if y > 2**31 or y < -2**31:
            y = 0
        return y

複習一下陣列玩法

li = [1, 2, 4, 3];
      0  1  2  3
li[1:3]   # => [2, 4]       取第一個到第三個(最後一個不取) 
li[2:]    # => [4, 3]       取第二個之後的數字(含第二個)
li[:3]    # => [1, 2, 4]    取到第三個之前的(不含第三個)
li[::2]   # =>[1, 4]        每兩個取一個 , [:3] 就輸出成 1,3 
li[::-1]  # => [3, 4, 2, 1] 倒轉

results matching ""

    No results matching ""