LeedCode的第八题:请你来实现一个 atoi
函数,使其能将字符串转换成整数。
其实这题就是排除题目的特殊情况就行
int myAtoi(string str) {
if(str.empty()) return 0;
int i = 0;
int sign = 1;//记录结果的正负
int result = 0;//用来保存结果
while(i < (int)str.size() && str[i] == ' ') ++i;//跳过空格
if(str[i] == '+' || str[i] == '-')//判定正负,并修改sign的值
sign = (str[i++] == '+') ? 1 : -1;
if(isalpha(str[i])) return 0;//如果跳过空格第一个字符就是字母的话,返回0
while(i < (int)str.size() && isdigit(str[i]))
{
if(result > INT_MAX/10 || (result == INT_MAX/10 && str[i] - '0' > 7))//判定是否越界
return (sign == 1) ? INT_MAX : INT_MIN;
result = 10*result + (str[i++] - '0');
}
return result*sign;//输出转换后的值并带有正负
}
之后想到前几天判断越界的方法,又稍微改进了一下
int myAtoi(string str) {
if(str.empty()) return 0;
int i = 0;
int sign = 1;
long int result = 0;
while(i < (int)str.size() && str[i] == ' ') ++i;
if(str[i] == '+' || str[i] == '-')
sign = (str[i++] == '+') ? 1 : -1;
if(isalpha(str[i])) return 0;
while(i < (int)str.size() && isdigit(str[i]))
{
result = 10*result + (str[i++] - '0');
if(result != (int) result)
return (sign == 1) ? INT_MAX : INT_MIN;
cout<<result<<endl;
}
return result*sign;
}
这题判定越界的方法是用一个长整型去存结果,当溢出时,长整型的结果和整型结果一定时不同的,这时候输出边界。