题目大意
给定一个字符串,将其题目要求转换为整数,具体要求可见原题链接(https://leetcode-cn.com/problems/string-to-integer-atoi/)。
分析
这道题恶心的地方在于对各种情况进行排除,我的做法是:
1.首先移除所有的前置空格,移除完成后判断是否是空串,如果是返回0;
2.接着判断第一个字符是否为正负号,如果是则第二个要求是数字才可以,如果不是,那么第一个字符要求是0-9;
3.现在我们到了要转换的整数的位置了,首先把所有的多余前导0移除;
4.接下来我们确定结束的位置,然后从高位开始转换,之所以要从高位开始,是因为可能存在如100000000000000000000000这种case使得结果溢出,注意在转换过程中可以判断是否已经超出了32位带符号整数的表示范围,如果超出,则直接返回相应的结果即可。
代码
int myAtoi(string str) {
while(str[0] == ' ') {
str.erase(0, 1);
}
if(str == "") {
return 0;
}
if((str[0] == '+' || str[0] == '-') && (str[1] > '9' || str[1] < '0')) {
return 0;
}
if((str[0] < '0' || str[0] > '9') && (str[0] != '-' && str[0] != '+')) {
return 0;
}
int op = 1;
if(str[0] == '-') {
op = -1;
str.erase(0, 1);
} else if(str[0] == '+') {
op = 1;
str.erase(0, 1);
}
int end = -1;
while(str[0] == '0') {
str.erase(0, 1);
}
for(int i = 0; i <= str.length(); i++) {
if(str[i] < '0' || str[i] > '9') {
end = i;
break;
}
}
long long sum = 0, ans = 0;
for(int i = 0; i < end; i++) {
sum *= 10;
sum += str[i] - '0';
ans = sum * op;
if(ans > 2147483647) {
return 2147483647;
}
if(ans < -2147483648) {
return -2147483648;
}
}
return ans;
}