題目:整數反轉
題目來源:https://leetcode-cn.com/problems/reverse-integer
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−2^31, 2^31 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
解題思路
題目中對數字反轉的結果有最大最小限制,這個限制實際上在 Java 中也是 int 型別的大小限制,把 [−2^31, 2^31 − 1] 這個公式計算一下,結果就是 [-2147483648, 2147483647] 。
接下來的就只剩下一個問題了,如何把一個整數進行反轉。
我這裡提供一個思路,我們對原數字除以 10 以後進行取模運算(取餘數):
大體思路就是上面這樣,然後注意邊緣值判斷,程式碼基本上就按照這個思路來:
public int reverse(int x) {
int res = 0;
while (x != 0) {
// 先獲取末尾數字
int tmp = x % 10;
if (res < -214748364 || (res == -214748364 && tmp < -8)) {
return 0;
}
if (res > 214748364 || (res == 214748364 && tmp > 7)) {
return 0;
}
res = res * 10 + tmp;
x /= 10;
}
return res;
}
這種邊界判斷方式稍顯笨重,我看了看別人的答案,看到一種溢位的判斷思路,感覺不錯分享下:
public int reverse_1(int x) {
int res = 0;
while (x != 0) {
if (res > 214748364 || res < -214748364) {
return 0;
}
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
這個結果提交 LeetCode 以後,直接看到 LeetCode 說執行耗時超過 100% 的使用者。
簡直意外的驚喜,這裡的判斷極限值的含義如下: 1463847412
極限最大值是 2147483648 ,除以 10 以後是 214748364 ,這裡當 res 是 214748364 時,輸入的 x 只能是 1463847412 ,因為 2463847412 、 3463847412 這些數字本身已經 int 溢位了。
思路非常巧妙,利用了 int 本身的溢位範圍,限制了輸入資料的大小,減少了需要判斷的可能性。