題目:給定一個整數,請將整數的每一位進行逆向,溢出的整數返回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;
}
}