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

LeetCode Reverse Integer:整數反轉與溢出處理

     編輯:關於C++

LeetCode 7「Reverse Integer」:將 32 位有符號整數數字反轉,溢出返回 0。本文分析負數處理、INT_MIN 特例、長整型中轉檢查溢出的標準解法。

問題要求

  • 輸入:32 位有符號整數 x。
  • 輸出:數字反轉後的整數,若超出 [-2³¹, 2³¹-1] 返回 0。
  • 例子:123 → 321,-123 → -321,120 → 21。

核心難點:INT_MIN 溢出

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;
    }
};

關鍵細節

  1. INT_MIN 特判:避免取反溢出。
  2. long long 中轉:反轉過程中可能暫時超出 32 位,用 64 位累積。
  3. 最終檢查:rev > INT_MAX 則溢出。
  4. 負號處理:先轉正反轉,最後加符號。

進階:無長整型版本(面試加分)

在反轉前預判溢出:

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 必須特判,這是最易遺漏的陷阱。

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