题目链接
思路:分两个部分:
第一个部分:通过while循环找到第一个有效的数字开始的位置
考虑判断的顺序:
1.前导空格
2.正负号+,-
3.前导零
4.开始读
5.读到非数字字符,直接返回0
注意:
1.前导空格只能出现在±,首位0,数字1-9之前
2.+,-号智能出现在首位0,数字1-9之前;并且只能出现一次
因此,当出现了+、-、或者0-9的数字后,用bool f = true进行标记,表示前导空格和+、-号不能再出现了
第二个部分:通过for循环形成我们要输出的整数
考虑:
1.所形成的数大于int范围(-2147483648,2147483647),直接返回2147483647或2147483647
(这个地方和LeetCode第7题很相似,题目链接)
2.出现其他字符时直接返回0
3.用int flag标识正负数,初始化flag = 1,若出现了-,flag=-1,后面形成的数字都要*flag;
class Solution
{
public:
int myAtoi(string s)
{
int k = 0;
int ans = 0;
int flag = 1;
bool f = false;
while (1)
{
if (s[k] == ' ' && f == false)
;
else if (s[k] == '+' && f == false)
{
flag = 1;
f = true;
}
else if (s[k] == '-' && f == false)
{
flag = -1;
f = true;
}
else if (s[k] == '0')
{
f = true;
if (s[k] == '0')
;
else if (s[k] >= '1' && s[k] <= '9')
break;
}
else if (s[k] >= '1' && s[k] <= '9')
break;
else
return ans;
k++;
}
for (int i = k; i < s.length(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
if (ans > 214748364 || (ans == 214748364 && s[i] > '7'))
return 2147483647;
if (ans < -214748364 || (ans == -214748364 && s[i] > '8'))
return -2147483648;
ans = ans * 10 + (s[i] - '0') * flag;
}
else
break;
}
return ans;
}
};