給定 32 位有號整數 x,反轉其十進位數字。反轉後超出 [INT_MIN, INT_MAX] 返回 0。負號保留。例如 123 → 321,-123 → -321,120 → 21。
INT_MIN 絕對值溢出,用 unsigned 或 long long 過渡)。%10)構建反轉數,每步預判溢出。result > (MAX - digit) / 10(同 atoi 技巧)。class Solution {
public:
int reverse(int x) {
int sign = x < 0 ? -1 : 1;
unsigned int n = sign == -1 ? (unsigned int)(-x) : x; // 避免 INT_MIN 絕對值 UB
unsigned int rev = 0;
const unsigned int MAX = 2147483647u;
const unsigned int MIN = 2147483648u; // |INT_MIN|
while (n) {
int digit = n % 10;
if (sign == 1 && rev > (MAX - digit) / 10) return 0;
if (sign == -1 && rev > (MIN - digit) / 10) return 0;
rev = rev * 10 + digit;
n /= 10;
}
return sign == 1 ? (int)rev : (int)(-rev);
}
};
unsigned int 儲存中間值,避免有號溢出未定義行為。INT_MIN 取負會溢出,改用 (unsigned int)(-x) 配合補碼特性正確得到 2147483648。| 輸入 | 輸出 | 說明 |
|---|---|---|
| 123 | 321 | 基本 |
| -123 | -321 | 負數 |
| 120 | 21 | 尾零 |
| 1534236469 | 0 | 溢出 (9646324351 > INT_MAX) |
| -2147483648 | 0 | INT_MIN 反轉溢出 |
| 0 | 0 | 邊界 |
整數反轉是「有界整數運算溢出安全」的縮影。掌握「無號中間值 + 預判除法檢查」模式,可應用於所有類似題目(如 atoi、乘法溢出檢測等),是面試與工程必備基本功。