这道题目玄之又玄,大家记住步骤就好啦:
- 处理空字符串
- 忽略前置空格
- 保存符号
- 处理非法输入
- 处理溢出
多想无益,就住就行了。
class Solution {
public:
int atoi(const char *str) {
int idx = 0, sign = 1, val = 0;
// 1. 空字符串
if (strlen(str) == 0) return 0;
// 2. 忽略前置0
while (str[idx] == ' ') ++idx;
// 3. 记录符号
if (str[idx] == '-') {sign = -1; ++idx;}
if (str[idx] == '+') {++idx;}
for (; idx < strlen(str); ++idx) {
// 4. 处理非法值
if (str[idx] > '9') break;
// 5. 处理溢出
if (val > INT32_MAX / 10 || (val == INT32_MAX / 10 && INT32_MAX % 10 < str[idx] - '0')) {
return sign == 1 ? INT32_MAX : INT32_MIN;
}
val = val * 10 + str[idx] - '0';
}
return val * sign;
}
};
京公网安备 11010502036488号