1、在想不到的地方出了int相加溢出的错误。
在做力扣228. 汇总区间时,出现了这个错误。
代码如下
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
if(!nums.size()) return {};
vector<string> ans;
for(int i=0;i<nums.size(); ){
int temp=nums[i],k=0;
while(i<nums.size()&&nums[i]==temp+k){
i++;
k++;
}
string str=to_string(temp);
if(k>1) str+=("->"+to_string(temp+k-1));//第13行
ans.push_back(str);
}
return ans;
}
};
这份代码,可以通过绝大多数样例。
但是样例[-2147483648,-2147483647,2147483646,2147483647]通不过,这是因为,当i=2时,temp先被赋值为了nums【2】,即2147483646,之后进行while循环,进行2次,就推出了循环,因为此时i已经是nums的最大的数据下标了,此时k被while循环修改为了2,之后在if判断语句中,要加上temp+k-1这个数变成的string,这个思路没有问题,但是,问题出在了数据本身,就是,此时temp已经是2147483646,而int类型的数据的最大值为(1<<31)-1,即十进制的2147483647,当temp先计算temp+k,即temp+2时,溢出了。我们可以修改一下程序,使得temp先计算-1之后再加k,即第13行的代码修改为 if(k>1) str+=("->"+to_string(temp-1+k));
看似没有问题了,但是,问题又来了,还是通不过这个样例,这是因为,此时对于这个样例的后两个数据,这么修改程序之后,是可以通过的,但是前两个数据不可以。仔细分析以下,当i=0时,将temp赋值为nums【0】,即为-2147483648,之后通过一个while循环,将k修改为了2,此时执行到13行的if语句,会发现,是先计算的temp-1。int类型在内存中的存储是4个字节,并且是以二进制的补码形式进行存放的,所以其范围为
FFFFFFFFH—>7FFFFFFFH,也就是-2147483648—>2147483647,当先计算temp-1,时,会下溢。
解决方法为
将k-1打包起来,先计算k-1,即修改为if(k>1) str+=("->"+to_string(temp+(k-1));
此时就可以处理这种极端的例子了。
力扣比pat好在可以看到自己的程序卡在了哪一个样例上。