首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode Reverse Integer:整數反轉的溢出安全實作

     編輯:C++ 入門

題目要求

給定 32 位有號整數 x,反轉其十進位數字。反轉後超出 [INT_MIN, INT_MAX] 返回 0。負號保留。例如 123 → 321,-123 → -321,120 → 21。

核心邏輯

  1. 記錄符號,取絕對值處理(注意 INT_MIN 絕對值溢出,用 unsigned 或 long long 過渡)。
  2. 逐位取餘(%10)構建反轉數,每步預判溢出。
  3. 溢出判斷:result > (MAX - digit) / 10(同 atoi 技巧)。
  4. 最後套用符號返回。

精簡代碼 (C++)

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。
  • 尾隨零自動被忽略(如 1200 → 21),無需額外處理。

測試用例

輸入輸出說明
123321基本
-123-321負數
12021尾零
15342364690溢出 (9646324351 > INT_MAX)
-21474836480INT_MIN 反轉溢出
00邊界

總結

整數反轉是「有界整數運算溢出安全」的縮影。掌握「無號中間值 + 預判除法檢查」模式,可應用於所有類似題目(如 atoi、乘法溢出檢測等),是面試與工程必備基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved