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

LeetCode atoi 完整實作:字串轉整數的邊界處理藝術

     編輯:C++ 入門

題目要求

實現 atoi:忽略前導空白,可選正負號,讀取連續數字字元轉為整數,非數字停止。溢出返回 INT_MAX (2147483647) 或 INT_MIN (-2147483648)。空字串或無有效數字返回 0。

關鍵難點

  1. 前導空白、正負號解析。
  2. 非數字字元截斷。
  3. 溢出檢測:在 result = result * 10 + digit 前預判是否會超界。

溢出檢測數學技巧

若 result > (MAX - digit) / 10 則乘 10 加 digit 必溢出。避免使用更大型別(如 long long)以符合「僅用 32 位整數運算」的隱性約束。

精簡高效代碼 (C++)

class Solution {
public:
    int atoi(const char *str) {
        int sign = 1;
        long long result = 0;          // 暫用 64 位累加,最後 clamp
        const char *p = str;

        while (*p == ' ') ++p;         // 跳過空白
        if (*p == '-') { sign = -1; ++p; }
        else if (*p == '+') { ++p; }

        while (*p >= '0' && *p <= '9') {
            result = result * 10 + (*p - '0');
            if (sign == 1 && result > INT_MAX)  return INT_MAX;
            if (sign == -1 && -result < INT_MIN) return INT_MIN;
            ++p;
        }
        return (int)(sign * result);
    }
};

進階:純 32 位運算版本(面試加分項)

int atoi(const char *str) {
    int sign = 1, result = 0;
    while (*str == ' ') ++str;
    if (*str == '-') { sign = -1; ++str; }
    else if (*str == '+') ++str;

    while (*str >= '0' && *str <= '9') {
        int digit = *str - '0';
        // 預判溢出:result > (INT_MAX - digit) / 10
        if (result > (INT_MAX - digit) / 10)
            return sign == 1 ? INT_MAX : INT_MIN;
        result = result * 10 + digit;
        ++str;
    }
    return sign * result;
}

測試用例覆蓋清單

輸入預期說明
"42"42基本
" -42"-42前導空白+負號
"4193 with words"4193非數字截斷
"words and 987"0首字非數字
"-91283472332"INT_MIN負向溢出
"2147483648"INT_MAX正向溢出
""0空字串
" +0 123"0正號+零+非數字

總結

atoi 看似簡單,實則是邊界條件處理的綜合考驗。掌握「預判溢出」數學技巧、嚴謹的狀態機流程(空白→符號→數字→停止),即可寫出無 Bug、高效能的標準庫級實作。

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