最近做题刷到lLeetCode的350题:求两个数组的交集II。我先用qsort()函数对两个数组进行升序排序,然后再对两个数组进行比较,求出交集,代码如下:
int cmp(void const *a,void const *b)
{
return *(int *)a -*(int *)b;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
if(nums1Size==0||nums2Size==0)
return NULL;
qsort(nums1,nums1Size,sizeof(nums1[0]),cmp);
qsort(nums2,nums2Size,sizeof(nums2[0]),cmp);
int i = 0 , j = 0 ;
int *newnum = (int *)malloc((nums1Size+nums2Size)*sizeof(int));
*returnSize = 0;
while(i < nums1Size && j < nums2Size)
{
if(nums1[i] > nums2[j])
j++;
else if(nums1[i] < nums2[j])
i++;
else
{
newnum[(*returnSize)++] = nums1[i];
i++;j++;
}
}
return newnum;
}
提交解答,出现下面结果:
看到这种情况,我的第一反应是这个测试用例有问题:-2147483648是不是超过整型范围了。查了一下,刚刚没超过范围,是整型的最小值(16位机 整型最小值-32678)。测试用例没问题,那只能是我程序的逻辑问题了,试着把测试用例代入程序中,逐条代码在纸上演算,没啥逻辑错误。其实这题也没啥逻辑的,可就是提交不成功,编程有时就是这样莫名其妙,无理取闹。排除了其它可能, 我不得不开始怀疑函数库自带的qsort()函数了,编了一段小程序看看它到底给我排成什么样了。
int main()
{
int a[4] = {-2147483648,1,2,3},i;
int b[3] = {1,-2147483648,-2147483648};
qsort(a,4,sizeof(int),cmp);
for(i=0;i<4;i++)
printf("%d ",a[i]);
printf("\n");
qsort(b,3,sizeof(int),cmp);
for(i=0;i<3;i++)
printf("%d ",b[i]);
getchar();
return 0;
}
运行结果:
看到运行结果我很高兴,终于找到病根了,用冒泡排序代替qsort()快速排序后,顺利提交成功了。至于为什么qsort()无法对-2147483648进行排序,这我就不得而知了。但我想,肯定是由于这个数太小了,将这个数改为-2147483647后,结果仍然一样。但改为-2147483646后,一切就恢复正常了。