面試題——整數逆向

題目:給定一個整數,請將整數的每一位進行逆向,溢出的整數返回0。

例如:輸入12345——輸出54321           輸入3450——輸出543

           輸入3450——輸出543

分析

類似於字符串的反轉一樣,可以藉助棧來實現。但是這樣會創建額外的空間,造成不必要的浪費。所以採用數學方法,來解決這道題。

首先考慮的是,給定一個整數X,將X%10,得到的餘數正好是該整數的最後一位。 再將整數X/10,就能得到除剛纔求餘除外的數。再將得到的數求餘,就會得到上一位整數的最後一位數。舉個例子,整數1234,1234%10=4,得到最後一位數。1234/10=123,再將123%10=3,然後將前一位得到的數4*10+3=43,反覆如此操作,就能得到反轉後的數字。

但是有一點要考慮,就是反轉之後的數字可能會溢出,其中包括正整數和負整數。我們就需要找出溢出的時刻出現在什麼階段。還是給定一個整數1234,假設int類型的最大上限是4310(打個比方),但是1234反轉之後是4321,很明顯溢出了。按照上面的方法反轉。正好是在12%10=2,12/10=1,前面求的值是43,再繼續計算下去,43*10+2=432。在這個時候就得要判斷與4310/10=431的大小,很明顯432是溢出了,因爲在432*10+求出的餘數是大於431*的,所以在計算到倒數第二位就應該判斷是否溢出。

代碼實現

package cn.mrlij.algorithm;

public class ReverseInt {

    public static void main(String[] args) {
        int reverseInt = reverseInt(1234);
        System.out.println(reverseInt);
    }

    /**
     * 整數反轉
     * @param target  目標整數
     * @return
     */
    public static int reverseInt(int target){
        int max = Integer.MAX_VALUE/10;
        int min = Integer.MIN_VALUE/10;
        int maxPop = Integer.MAX_VALUE % 10;
        int minPop = Integer.MIN_VALUE % 10;
        int res = 0;
        while (target != 0){
            target = target / 10;
            int pop = target % 10;
            if(target > max || (target == max && pop > maxPop)){
                return 0;
            }
            if(target < min || (target == min && pop <minPop)){
                return 0;
            }
            res = res * 10 +pop;
        }
        return res;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章