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

LeetCode 8 String to Integer (atoi):健壯字符串解析全攻略

     編輯:關於C++

題目大意

實現 atoi:跳過前導空格,讀取可選符號,盡可能多讀取數字字符,忽略後續非數字。結果夾在 [INT_MIN, INT_MAX] 區間內。無效輸入返回 0。

狀態機解析流程

  1. 跳過空格:while (i < n && s[i] == ' ') i++;
  2. 處理符號:sign = (s[i] == '-') ? -1 : 1; if (s[i]=='+'||s[i]=='-') i++;
  3. 讀取數字:while (i < n && isdigit(s[i])) { digit = s[i]-'0'; ... }
  4. 溢出保護:同 LeetCode 7,在 ans = ans*10 + digit 前預判。
  5. 應用符號並夾適:ans *= sign; return clamp(ans, INT_MIN, INT_MAX);

C++ 參考實現

class Solution {
public:
    int myAtoi(string s) {
        long long ans = 0;
        int i = 0, n = s.size(), sign = 1;
        while (i < n && s[i] == ' ') ++i;
        if (i < n && (s[i] == '+' || s[i] == '-')) {
            sign = (s[i] == '-') ? -1 : 1;
            ++i;
        }
        while (i < n && isdigit(s[i])) {
            int digit = s[i++] - '0';
            if (ans > INT_MAX/10 || (ans == INT_MAX/10 && digit > 7)) {
                return sign == 1 ? INT_MAX : INT_MIN;
            }
            ans = ans * 10 + digit;
        }
        return (int)(sign * ans);
    }
};

常見陷阱

  • "+-12" → 0(符號後必須是數字)。
  • " 0000000000012345678" → 12345678(前導 0 合法)。
  • "2147483648" → 2147483647(夾適)。
  • 空串或全空格 → 0。

總結

atoi 是解析器寫作的縮影:狀態清晰、邊界全覆蓋、溢出預判。建議面試時畫出狀態轉移圖(start → signed → in_number → end),再落地代碼,條理分明且不易漏情況。

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