需要排除掉前面的空格,并获取符号,如果符号不在数字前是无效的,一串数字后面如果出现了非数字的符号也停止遍历
class Solution {
public:
int myAtoi(string s) {
int n = s.size();
int flag = 1;
long sum = 0;
int i = 0;
while(s[i] == ' ') i++;
if(i == n) return 0;
if(s[i] == '+'){
flag = 1;
i++;
}else if(s[i] == '-'){
flag = -1;
i++;
}
while(i < n){
if(!isdigit(s[i])) break;
//判断溢出,大于等于8,对于正数溢出,对于负数,恰好是INT_MIN
if(sum > INT_MAX / 10|| (sum == INT_MAX / 10 && (s[i] - '0') > 7)){
if(flag == 1) return INT_MAX;
else return INT_MIN;
}
sum = sum * 10 + (s[i] - '0');
i++;
}
return sum * flag;//符号位最后加上
}
};
class Solution {
public:
int myAtoi(string s) {
int sign = 1, tmp = 0, i = 0;
while(s[i] == ' ') ++i; //1.忽略前导空格
if(s[i] == '+' || s[i] == '-') //2.确定正负号
sign = (s[i++] == '-') ? -1 : 1; //s[i]为+的话sign依旧为1,为-的话sign为-1
while(s[i] >= '0' && s[i] <= '9') //3.检查输入是否合法
{
if(tmp > INT_MAX / 10 || (tmp == INT_MAX / 10 && s[i] - '0' > 7)) //4.是否溢出
return sign == 1 ? INT_MAX : INT_MIN;
tmp = tmp * 10 + (s[i++] - '0'); //5.不加括号有溢出风险
}
return tmp * sign;
}
};
作者:zrita
链接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/c-10xing-shi-xian-atoi-z-by-zrita-z007/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
判断数据溢出,首先是这个数乘10后是否会溢出,以及这个数乘10后加上新的数是否会溢出
一旦溢出就停止,不需要全部算完然后判断