LeetCode 7「Reverse Integer」:將 32 位有符號整數數字反轉,溢出返回 0。本文分析負數處理、INT_MIN 特例、長整型中轉檢查溢出的標準解法。
x。[-2³¹, 2³¹-1] 返回 0。INT_MIN = -2147483648,絕對值 2147483648 > INT_MAX (2147483647)。
若直接 x = -x,補碼乘法導致 x 仍為 INT_MIN(因 -INT_MIN 溢出回繞)。
必須特別判斷 x == INT_MIN 直接返回 0。
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN) return 0; // 特判
bool neg = x < 0;
if (neg) x = -x; // 現在 x > 0 且 ≤ INT_MAX
long long rev = 0;
while (x != 0) {
rev = rev * 10 + x % 10;
x /= 10;
}
if (rev > INT_MAX) return 0;
return neg ? -rev : rev;
}
};
rev > INT_MAX 則溢出。在反轉前預判溢出:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
// 檢查 rev*10 + pop 是否溢出
if (rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
原理:INT_MAX = 2147483647,末位 7;INT_MIN = -2147483648,末位 -8。
整數反轉看似簡單,實則考察邊界條件處理(INT_MIN)、溢出檢查(長整型或預判)、負數處理。面試中建議先給出長整型版本(清晰易懂),再補充無長整型預判版本展示功力。記住:x == INT_MIN 必須特判,這是最易遺漏的陷阱。