int cmp(const void *test1, const void *test2)
{
int *a = (int *)test1;
int *b = (int *)test2;
return *a - *b;
}
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
int *arr = malloc(sizeof(int) * numsSize);
int i = 0, j = 0, loseNum = 0, lastNum = 0;
int index = 0;/*缺失的数字放入到arr数组中的位置*/
int counts = 0;/*记录两个数字之间相差多少个数字*/
qsort(nums, numsSize, sizeof(int), cmp);/*升序排序*/
/*1.先找到常规情况--后一个数比前一个数差值大于1的,中间必然确实了数字*/
for(i = 0; i < numsSize; i++)
{
if(nums[i] - lastNum > 1)
{
counts = nums[i] - lastNum - 1;/*计算出2个数字之间缺了多少个数字*/
for(j = 0; j < counts; j++)
{
arr[index] = lastNum + j + 1;
index++;
}
}
lastNum = nums[i];
}
/*2.特殊情况--前后相邻两个数字相同的*/
if(nums[numsSize - 1] != numsSize)
{
counts = numsSize - nums[i - 1];/*用长度去减数组的最后一个数字,获得需要补全的数字个数*/
for(j = 0; j < counts; j++)
{
arr[index] = nums[i - 1] + j + 1;
index++;
}
}
*returnSize = index;
return arr;
}
使用了遍历的方法,易懂!