實現 atoi:忽略前導空白,可選正負號,讀取連續數字字元轉為整數,非數字停止。溢出返回 INT_MAX (2147483647) 或 INT_MIN (-2147483648)。空字串或無有效數字返回 0。
result = result * 10 + digit 前預判是否會超界。若 result > (MAX - digit) / 10 則乘 10 加 digit 必溢出。避免使用更大型別(如 long long)以符合「僅用 32 位整數運算」的隱性約束。
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);
}
};
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、高效能的標準庫級實作。