# 字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

注意:

 

示例 1:

输入:s = "42"

输出:
42
解释:
加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 第 1 步:"42"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"42"(读入 "42") ^ 解析得到整数 42 。 由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = "   -42"

输出:
-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉) ^ 第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数) ^ 第 3 步:" -42"(读入 "42") ^ 解析得到整数 -42 。 由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = "4193 with words"

输出:
4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止) ^ 解析得到整数 4193 。 由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

示例 4:

输入:s = "words and 987"

输出:
0
解释:
第 1 步:"words and 987"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止) ^ 解析得到整数 0 ,因为没有读入任何数字。 由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。

示例 5:

输入:s = "-91283472332"

输出:
-2147483648
解释:
第 1 步:"-91283472332"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"-91283472332"(读入 '-' 字符,所以结果应该是负数) ^ 第 3 步:"-91283472332"(读入 "91283472332") ^ 解析得到整数 -91283472332 。 由于 -91283472332 小于范围 [-231, 231 - 1] 的下界,最终结果被截断为 -231 = -2147483648 。

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp int main() { Solution sol; cout << sol.myAtoi("-42") << endl; return 0; } ``` ## 答案 ```cpp class Solution { public: int myAtoi(string s) { int index = 0; while (index < s.length() && s[index] == ' ') index++; int sign = 1; if (index < s.length() && (s[index] == '+' || s[index] == '-')) { if (s[index] == '-') sign = -1; index++; } int val = 0; while (index < s.length() && (s[index] >= '0' && s[index] <= '9')) { if (val > (2147483647 - (s[index] - '0')) / 10) { if (sign == -1) return -2147483648; else return 2147483647; } val = val * 10 + (s[index] - '0'); index++; } return val; } }; ``` ## 选项 ### A ```cpp class Solution { public: int myAtoi(string str) { int d = 0; istringstream is(str); is >> d; return d; } }; ``` ### B ```cpp class Solution { public: int myAtoi(string str) { int i = 0; while (' ' == str[i]) ++i; long flag = 1; if ('+' == str[i]) { flag = 1; return fun(str, ++i, flag); } else if ('-' == str[i]) { flag = -1; return fun(str, ++i, flag); } else if (str[i] - '0' >= 0 && str[i] - '0' <= 9) { flag = 1; return fun(str, i, flag); } else { return 0; } } int fun(string str, int i, const long flag) { long res = 0; while (str[i] - '0' >= 0 && str[i] - '0' <= 9) { res = res * 10 + (str[i++] - '0'); if (res * flag > pow(2, 31) - 1) return INT_MAX; if (res * flag < -pow(2, 31)) return INT_MIN; } res = res * flag; return int(res); } }; ``` ### C ```cpp class Solution { public: int myAtoi(string str) { int max = INT_MAX / 10; int min = INT_MIN / 10; int max_f = INT_MAX % 10; int min_f = INT_MIN % 10; int len = str.length(); bool flag = false; int sum = 0; int symbol = 1; for (int i = 0; i < len; i++) { char ch = str[i]; if (!flag) { if (ch == ' ') continue; else if (ch == '+') flag = true; else if (ch == '-') { flag = true; symbol = -1; } else if (ch <= '9' && ch >= '0') flag = true; else break; } else if (ch > '9' || ch < '0') break; if (ch <= '9' && ch >= '0') { int pos = symbol * (ch - '0'); if (sum > max || (sum == max && pos >= max_f)) return INT_MAX; if (sum < min || (sum == min && pos <= min_f)) return INT_MIN; sum = sum * 10 + pos; } } return sum; } }; ```