问题:
实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。
样例:
"10" =>10
"-1" => -1
"123123123123123" => 2147483647
"1.0" => 1
分析:
题目不能,只是各种细节处理要注意,代码有详细注释;
代码
class Solution {
public:
int atoi(string str) {
bool isNagitave = false;
int i = 0;
long long res = 0;
// 去掉空白
while(i < str.size() && str[i] == ' ') i++;
// 判断符号
if(i < str.size() && str[i] == '-') {
isNagitave = true;
i++;
} else if(i < str.size() && str[i] == '+') {
i++;
}
// 去掉前面的0
while(i < str.size() && str[i] == '0') i++;
int start = i; // 用于判断小数点是否是第一位
// 计算数字
while(i < str.size()) {
if(str[i] >= '0' && str[i] <= '9') {
res = res * 10 + (long long)(str[i] - '0');
// 判断正数越界
if(!isNagitave && res >= 0x7fffffff) {
return 0x7fffffff;
// 判断负数越界
} else if(isNagitave && res >= (long long)0x7fffffff + (long long)1) {
return 0x80000000;
}
} else if(str[i] == '.'){ // 判断小数点是否在正确的位置
// 小数点不能是第一位也不能是最后一位
if(i == str.size() - 1 || i == start) {
res = 0;
}
// 遇到小数点就必须得停止
break;
} else{
// 遇到其他字符直接跳出,题目的测试用例是这样
// 例如:“ 52lintcode”返回的就是52
break;
}
i++;
}
res = isNagitave ? -res : res;
return (int)res;
}
};