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

LeetCode 8. 字符串轉整數 (atoi):邊界條件全覆蓋實現

     編輯:關於C語言

LeetCode 8. 字符串轉整數 (atoi)

題目要求

  • 忽略前導空格。
  • 可選符號 +/-。
  • 讀取連續數字字符,遇非數字停止。
  • 無有效數字返回 0。
  • 溢出返回 INT_MAX (2147483647) 或 INT_MIN (-2147483648)。

核心邏輯與邊界處理

  1. 跳過空格:while (*str == ' ') str++;
  2. 處理符號:記錄 sign = 1/-1,指針後移。
  3. 累加數字:sum = sum * 10 + (*str - '0'),用 long long 避免中間溢出。
  4. 非數字截斷:if (*str < '0' || *str > '9') break;
  5. 溢出檢查:每步或最終判斷 sum > INT_MAX(正數)或 sum > (long long)INT_MAX + 1(負數)。

精簡健壯實現

int myAtoi(char *str) {
    int sign = 1;
    long long sum = 0;  // 防止中間溢出
    
    if (!str) return 0;
    while (*str == ' ') str++;           // 1. 跳過空格
    
    if (*str == '-') { sign = -1; str++; }  // 2. 符號
    else if (*str == '+') { sign = 1; str++; }
    
    while (*str) {                       // 3. 累加數字
        if (*str < '0' || *str > '9') break;
        sum = sum * 10 + (*str - '0');
        if (sign == 1 && sum > INT_MAX) return INT_MAX;      // 4. 正溢出
        if (sign == -1 && sum > (long long)INT_MAX + 1) return INT_MIN; // 負溢出
        str++;
    }
    return (int)(sum * sign);
}

關鍵測試用例

輸入輸出說明
"42"42正常
" -42"-42前導空格+負號
"4193 with words"4193非數字截斷
"words and 987"0首字符非數字/符號
"-91283472332"-2147483648負溢出
"+-12"0雙符號無效
" 0000000000012345678"12345678前導零
""0空字符串

常見錯誤避坑

  • 用 int 累加導致中間溢出未檢測 → **必須用 long long 或每步檢查 sum > INT_MAX/10 等技巧**。
  • 未處理 "+-12" 類雙符號 → 符號處理後應立即進入數字循環,遇非數字直接斷開。
  • 負溢出邊界:INT_MIN = -2147483648,絕對值 2147483648 超出 INT_MAX,故負數判斷閾值為 (long long)INT_MAX + 1。
  • atoi 標準庫行為未定義於溢出,**手寫實現必須明確截斷**。

總結

atoi 看似簡單,實則邊界條件極多(空格、符號、非數字、溢出、空串)。掌握「長整型累加 + 即時溢出檢查 + 單次遍歷」模板,可應對所有字符串轉數字類問題(如 strtol、科學計數法解析等)。

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