1. 程式人生 > 其它 >第七題(簡單):整數反轉

第七題(簡單):整數反轉

技術標籤:LeetCodeleetcode

題目:
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321

示例 2:
輸入: -123
輸出: -321

示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為
[−231, 231 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
自己的程式碼:

   public int reverse(int x) {
       long rev=0;
       while(x!= 0){
           int pop  = x%10;
           x/=10;
           rev = rev *10+pop;
       }
       if(rev>Integer.MAX_VALUE||rev<Integer.MIN_VALUE){
           return 0;
       }
       return (int)rev;
   }

考慮了溢位,可以正確執行,可以正確提交

官方程式碼:

public int reverse1(int x) {
        int rev = 0;//儲存的是倒序
        while (x != 0) {
            int pop = x % 10;//取模,得到的是最後一位數
            x /= 10;//取出最後一個數後,除十,即抹去最後那位數
            if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }

總結:
int 型別的大小 範圍是intMAX = 2147483647 , intMin = - 2147483648 。
需要注意溢位,一旦溢位就返回0
自己寫的程式碼是無腦判斷溢位,會加大時間複雜度。
即,會出現,當前計算值已經溢位的情況,再計算下去,還是溢位,無意義。
可以參考官方的程式碼

對於大於 intMax 的討論,此時 x 一定是正數,pop 也是正數。 如果 rev > intMax / 10 ,那麼沒的說,此時肯定溢位了。 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此時 rev * 10 就 是 2147483640 如果 pop 大於 7 ,那麼就一定溢位了。但是!如果假設 pop 等於 8,那 麼意味著原數 x 是 8463847412 了,輸入的是 int ,而此時是溢位的狀態,所以不可能輸 入,所以意味著 pop 不可能大於 7 ,也就意味著 rev == intMax / 10 時不會造成溢位。 如果 rev < intMax / 10 ,意味著 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此時再加上 pop ,一定不會溢位