使用long long
class Solution {
public:
int myAtoi(string s) {
int k = 0;
while (k < s.size() && s[k] == ' ') k ++; //先过滤掉开头的空格
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还只是正数
}
res *= minus;
if (res > INT_MAX) res = INT_MAX; //大于 2^31 − 1 的整数应该被固定为 2^31 − 1
if (res < INT_MIN) res = INT_MIN;
return res;
}
};
使用 int
class Solution {
public:
int myAtoi(string s) {
int k = 0;
while (k < s.size() && s[k] == ' ') k ++; //先过滤掉开头的空格
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'; //连续数字算出来, k++别忘记
if (minus > 0 && res > (INT_MAX - x) / 10) return INT_MAX; // res是正数时
if (minus < 0 && -res < (INT_MIN + x) / 10) return INT_MIN; //res是负数时
// 注意:INT_MIN = -2148...8 INT_MAX = 2148...7 负数绝对值比正数多一个,所以要特判
// res = INT_MAX + 1,需要给res乘上minus=-1,但是用正数无法存,所以用了负数-res * 10 - x == INT_MIN
if (-res * 10 - x == INT_MIN) return INT_MIN;
res = res * 10 + x;
}
res *= minus;
return res;
}
};