整數反轉
1.題目描述
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
2.思路
反轉數字,首先需要獲得每一位上的數字,對10取模即可,然後倒過來拼成一個新的數字。由於不清楚數據的長度,開一個32位的數組來存儲它的每一位數字,肯定是足夠。題中還要求做反轉後的數字的越界判斷,可使用Integer裏面的最大值和最小值常量數據進行判斷。時間複雜度爲O(n).
3.解法
public int reverse(int x) {
int[] resultArray = new int[32];
int count = 0;
long result = 0;
while(true){
resultArray[count] = x%10;
count++;
x = x/10;
if(x==0)
break;
}
count--;
for(int i = 0;i <32;i++){
if(resultArray[i]!=0)
result +=resultArray[i]*Math.pow(10,count);
count--;
}
if(result<Integer.MIN_VALUE||result>Integer.MAX_VALUE)return 0;
return (int)result;
}
網上更爲簡潔的做法,一次循環即可。一邊整體移位,一邊往後遍歷。最妙的是,用強制轉換後的(int)n做對比,比我用Integer的最大最小值要簡潔的多了。
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;
x = x/10;
}
return (int)n==n? (int)n:0;
}