實現 atoi:跳過前導空格,讀取可選符號,盡可能多讀取數字字符,忽略後續非數字。結果夾在 [INT_MIN, INT_MAX] 區間內。無效輸入返回 0。
while (i < n && s[i] == ' ') i++;sign = (s[i] == '-') ? -1 : 1; if (s[i]=='+'||s[i]=='-') i++;while (i < n && isdigit(s[i])) { digit = s[i]-'0'; ... }ans = ans*10 + digit 前預判。ans *= sign; return clamp(ans, INT_MIN, INT_MAX);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(夾適)。atoi 是解析器寫作的縮影:狀態清晰、邊界全覆蓋、溢出預判。建議面試時畫出狀態轉移圖(start → signed → in_number → end),再落地代碼,條理分明且不易漏情況。