转换数字时,判断溢出必须使用小于或者大于,不能使用小于等于或者大于等于,以力扣第8题为例
int myAtoi(string s) {
int i = 0;
while(s[i] == ' ') i++;
bool flag = false;
if(s[i] == '+' || s[i] == '-')
{
if(s[i] == '-') flag = true;
i++;
}
int ans = 0;
for(; s[i] >= '0' && s[i] <= '9'; i++)
{
int val = s[i] - '0';
if(flag) val = -val;
if(!flag && ans > (INT_MAX - val) / 10) return INT_MAX;
if( flag && ans < (INT_MIN - val) / 10) return INT_MIN;
ans = ans * 10 + val;
}
return ans;
}
如果if(!flag && ans > (INT_MAX - val) / 10) return INT_MAX;
改为if(!flag && ans >= (INT_MAX - val) / 10) return INT_MAX;
显然INT_MAX = 2147483647
,
当s = 2147483641
时,
走到最后一步,ans = 214748364
, val = 1
,
此时显然ans == (INT_MAX - val) / 10
,
从而返回错误答案,
必须使用大于才能纠正错误