Medium草稿★★★★★O(log x) 時間 · O(1) 空間
Bit ManipulationMath
Patterns💡 位元技巧🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

7Reverse IntegerBit ManipulationMediumBit Manipulation

給定一個 32 位元有號整數 x,回傳將其數字部分反轉後的結果。如果反轉後溢出 32 位元有號整數範圍 [-2^31, 2^31 - 1],則回傳 0。

Example:

Input: x = -123 Output: -321

Intuition

TIP

核心思路:逐位取出末位數字 (x % 10),組裝到結果中 (result * 10 + digit),每步檢查溢位。

Approaches

1. Overflow Check with Long — O(log x) / O(1)
  • Idea: 用 Long 型別儲存中間結果,反轉完成後檢查是否在 Int 範圍內
  • Time: O(log x) - 數字的位數
  • Space: O(1)
class Solution {
    fun reverse(x: Int): Int {
        var num = x
        var result = 0L
        while (num != 0) {
            result = result * 10 + num % 10
            num /= 10
        }
        return if (result < Int.MIN_VALUE || result > Int.MAX_VALUE) 0 else result.toInt()
    }
}
⭐ 2. Pure-Int Overflow Check — O(log x) / O(1)
  • Idea: 不用 Long,在每次乘 10 前檢查 result 是否會溢出 Int 範圍
  • Time: O(log x) - 數字的位數
  • Space: O(1)
class Solution {
    fun reverse(x: Int): Int {
        var num = x
        var result = 0
        while (num != 0) {
            val digit = num % 10
            num /= 10
            if (result > Int.MAX_VALUE / 10 || (result == Int.MAX_VALUE / 10 && digit > 7)) return 0
            if (result < Int.MIN_VALUE / 10 || (result == Int.MIN_VALUE / 10 && digit < -8)) return 0
            result = result * 10 + digit
        }
        return result
    }
}

WARNING

Int.MAX_VALUE = 2147483647(末位 7)、Int.MIN_VALUE = -2147483648(末位 -8),所以邊界檢查用 7 和 -8。

Note: String Reversal

將數字轉字串反轉,再轉回數字。雖然直覺但面試中不建議,因為繞開了溢位處理的核心考點。

class Solution {
    fun reverse(x: Int): Int {
        val sign = if (x < 0) -1 else 1
        val reversed = Math.abs(x.toLong()).toString().reversed()
        return try {
            sign * reversed.toInt()
        } catch (e: NumberFormatException) {
            0
        }
    }
}

🔑 Takeaways