每日一道 LeetCode (2):整數反轉

極客挖掘機發表於2020-07-30

題目:整數反轉

題目來源: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 本身的溢位範圍,限制了輸入資料的大小,減少了需要判斷的可能性。

相關文章