#include <iostream>
#include <string>
#include <climits>
class Solution {
public:
int myAtoi(std::string str)
{
int flag = 1; // 正负号
int i = 0; // 下标
int ret = 0; // 结果
int size = str.size();
// 忽略前导空格
while (i < size && str[i] == ' ') {
++i;
}
// 处理符号
if (i < size && str[i] == '-') {
flag = -1;
++i;
} else if (i < size && str[i] == '+') {
++i;
}
// 转换数字
while (i < size && str[i] >= '0' && str[i] <= '9') {
int digit = str[i] - '0';
// 检查溢出
if (ret > (INT_MAX - digit) / 10) {
return flag == 1 ? INT_MAX : INT_MIN;
}
ret = ret * 10 + digit;
++i;
}
return flag * ret;
}
};
int main() {
Solution sol;
std::string input = " -42";
std::cout << sol.myAtoi(input) << std::endl;
return 0;
}
四、代码逻辑详解
1. 变量初始化
flag:用于记录结果的正负号,初始值为 1,表示正数。
i:用于遍历字符串的下标,初始值为 0。
ret:用于存储转换后的整数结果,初始值为 0。
size:字符串的长度。
2. 忽略前导空格
cpp复制代码
while (i < size && str[i] == ' ') {
++i;
}
使用一个 while 循环,从字符串的开头开始,跳过所有的空格字符,直到遇到第一个非空格字符。
3. 处理符号
cpp复制代码
if (i < size && str[i] == '-') {
flag = -1;
++i;
} else if (i < size && str[i] == '+') {
++i;
}
检查第一个非空格字符是否为 + 或 -。如果是 -,则将 flag 设为 -1,表示结果为负数;如果是 +,则直接跳过该字符;如果没有符号,则默认结果为正数。
4. 转换数字
cpp复制代码
while (i < size && str[i] >= '0' && str[i] <= '9') {
int digit = str[i] - '0';
// 检查溢出
if (ret > (INT_MAX - digit) / 10) {
return flag == 1 ? INT_MAX : INT_MIN;
}
ret = ret * 10 + digit;
++i;
}
使用一个 while 循环,从符号字符之后开始,依次读取数字字符。将字符转换为对应的数字 digit,并将其加入到结果 ret 中。在每次更新 ret 之前,检查是否会发生溢出。如果 ret 乘以 10 再加上 digit 会超过 INT_MAX,则根据 flag 的值返回 INT_MAX 或 INT_MIN。