問題
給定一個范圍為 32 位 int 的整數,將其顛倒。
例 1:輸入: 123 輸出: 321
例 2:輸入: -123 輸出: -321
例 3:輸入: 120 輸出: 21
注意:
假設我們的環境只能處理 32 位 int 范圍內的整數。根據這個假設,如果顛倒后的結果超過這個范圍,則返回 0。
思路
主要思路很簡單,將數字不斷地除以10,就會從低位到高位得到每一位數字。然后把存儲結果值的變量乘以10然后加上這一個數字作為結果值,如此反復即可。但是本題的重點并不在此,它考察的是你如何處理上越界和下越界的問題。我想的很簡單,越界了應該會產生異常,產生異常直接捕獲,然后返回0不就得了。可是問題是程序不捕獲這個,換句話說,這個根本不是異常,它直接崩給你看。那沒辦法了,只能通過程序自己寫處理邏輯了。
先來看上越界,你是不可能通過最后的結果值和int的最大值去比較的,因為還沒等比較呢,在你還沒有算出結果值之前程序就已經崩了。于是通過算最后的結果值去和int的最大值去比較是不可取的,那怎么辦?換條路唄。因為最后的結果值是在上一個結果值的基礎上乘以10然后再加上得到的那單個數字得到的,那你只需要對int的最大值進行逆操作算出次大值,其實就是除以10,然后把倒數第二個結果值和這個次大值進行比較,如果倒數第二個結果值比這個次大值大,那就沒有必要算了,直接返回0吧。但是問題是計算機的整數除法是沒有小數點的,它直接給你截斷了,于是你就得另作打算。所以你只能把int的最大值的個位和其他位拆開成兩部分去和倒數第二個結果值進行比較。先看在int的次大值的十位以及十位以上的位和倒數第二個結果值之間的比較,如果這個倒數第二個結果值大于int的次大值,那就返回0,因為只要乘以10,現在的倒數第二個結果值的個位就會變成十位,而int的次大值乘以10以后的十位是不變的,所以此時就已經知道最后的結果了。如果相等,那說明還有必要去比較一下個位,那就不用說了,如果作為結果值的個位的這個數字如果比int的最大值的個位還大,那肯定就越界了,直接返回0,否則就沒越界,就正常計算唄。
上面說的是上越界的情況,接下來該說說下越界的情況,有沒有統一處理上下越界的方法。須知int是一個符號型變量的類型就是說它有一位是用來表示符號的,而其他位是用來表示數值的。從絕對值而言,負數的范圍比正數多一個,因為0占用了正數的一個名額。所以先取絕對值去比較int的最大值或者最小值的十位及以上的尾組成的數值,接下來就剩下個位數字了,這個時候可以根據正負區別對待。具體來說就是如果是負數就和int的最小值的個位去比較,如果大于就返回0,否則正常計算。如果是正數就和int的最大值的個位去比較,如果大于就返回0,否則正常計算。
至此得出具體的算法。
使用
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
System.out.println(Solution.reverseInt(-1463847412));
}
}
輸出
-2147483641
Process finished with exit code 0
實現
package com.company;
public class Solution {
static int reverseInt(int inputInt) {
if (inputInt > Integer.MAX_VALUE || inputInt < Integer.MIN_VALUE) {
System.out.println("輸入數字越界");
return 0;
}
int pseudoMax = Integer.MAX_VALUE / 10;
int maxLowestNumber = Integer.MAX_VALUE % 10;
int minLowestNumber = Integer.MIN_VALUE % 10;
int inputCopy = inputInt;
int result = 0;
while (inputCopy != 0) {
int singleNumber = inputCopy % 10;
inputCopy /= 10;
if (Math.abs(result) > pseudoMax) {
return 0;
} else if (Math.abs(result) == pseudoMax) {
result *= 10;
if (inputInt < 0) {
if (singleNumber < minLowestNumber)return 0;
else result += singleNumber;
} else {
if (singleNumber > maxLowestNumber)return 0;
else result += singleNumber;
}
} else {
result = result * 10 + singleNumber;
}
}
return result;
}
}