用longlong定义res的写法
//longlong写法
class Solution {
public:
int myAtoi(string s) {
//先去除前导0
int k = 0;
while(k < s.size() && s[k] ==' ')k++;
//如果全是空格 肯定输出0
if(k == s.size()) return 0;
int minus = 1;
if(s[k] == '-') minus = -1, k ++;
else if(s[k] == '+') k ++ ;
long long res = 0;
while(k < s.size() && s[k] >= '0' && s[k] <= '9')
{
res = res * 10 + s[k] - '0';
k ++ ;
if(res > INT_MAX) break;
}
//带上符号
res *= minus;
if(res > INT_MAX) return INT_MAX;
if(res < INT_MIN) return INT_MIN;
return res;
}
};
用int定义res的写法
class Solution {
public:
int myAtoi(string s) {
//先去除前导0
int k = 0;
while(k < s.size() && s[k] ==' ')k++;
//如果全是空格 肯定输出0
if(k == s.size()) return 0;
int minus = 1;
if(s[k] == '-') minus = -1, k ++;
else if(s[k] == '+') k ++ ;
int res = 0;
while(k < s.size() && s[k] >= '0' && s[k] <= '9')
{
int x = s[k] - '0';
if(minus > 0 && res > (INT_MAX -x) / 10) return INT_MAX;
if(minus < 0 && -res < (INT_MIN + x) / 10) return INT_MIN;
//注意 如果是负数的话 int类型的res是存不下来INT_MIN的绝对值的
//因为INT_MIN的绝对值比INT_MAX的绝对值大1,所以如果是负数,且绝对值等于INT_MIN的绝对值
//18和19行代码是不会执行的,但是23行执行之后res会爆int
if(-res*10 - x == INT_MIN) return INT_MIN;
res = res * 10 + x;
k ++ ;
if(res > INT_MAX) break;
}
//带上符号
res *= minus;
if(res > INT_MAX) return INT_MAX;
if(res < INT_MIN) return INT_MIN;
return res;
}
};