实现转换字符串为整数的atoi
。
提示:仔细考虑所有可能的输入。如果你希望挑战的话,不要看下文,自己问自己会有什么样的可能的输入。
另:这道题有意使用了混乱的描述(比如,没有指出输入的格式)。你要负责处理所有可能的输入。
更新(2015-2-10):
C++
的函数签名已更新。如果你看到你的函数签名接受const char *
作为参数,请点击重新加载按钮来重设函数定义。
atoi的要求:
函数首先抛弃尽可能多的空格,直到发现第一个非空格字符。然后,从这个字符开始,撷取一个可选的正负号后接尽可能多的数字,将它们转换为数值。
在数字的后面,字符串可能含有其他字符,它们将被忽略,不影响函数的行为。
如果第一个非空格的序列不是有效的数值,或不存在这种序列(字符串空或只含空格),将不做任何转换。
如果没有有效的转换,返回零。如果数值大于数值能表示的范围,返回INT_MAX(2147483647)或INT_MIN(-2147483648)。
我的想法:
- 这题是要自己实现atoi,所以用Python就太耍赖了,C++也可以用stringstream之类的间接耍赖。
- 溢出检查和第007题类似,但是要检查新数等于-214748364或214748364的情况。
C89(5ms):
int myAtoi(char *str)
{
int negative = 0, answer = 0, current;
for(; *str != '\0' && *str == ' '; ++str);
if(*str == '+') ++str;
else if(*str == '-')
{
negative = 1;
++str;
}
for(; *str >= '0' && *str <= '9'; ++str)
{
current = *str - '0';
if(answer > 214748364)
{
if(negative)
return -2147483648;
return 2147483647;
}
else if(answer == 214748364)
{
if(negative && current == 9)
{
return -2147483648;
}
if(!negative && current > 7)
{
return 2147483647;
}
}
answer = answer * 10 + current;
}
if(negative)
return -answer;
return answer;
}