645. 错误的集合 - 力扣(LeetCode) (leetcode-cn.com)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp (const void *pa,const void*pb)
{
return *(int*)pa - *(int*)pb;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize){
int*ret =(int*)malloc(sizeof(int)*2);//一共两个元素我们就开辟两个动态内存空间
qsort(nums,numsSize,sizeof(int),cmp);//排列成升序便于相邻两元素重复利于找出
int i=0;
int bfr =0;//定义一个本元素前面的元素,为了防止第一个元素就是丢失的数字我们将最开始设置为0
for(i=0;i<numsSize;i++)//遍历整个数组
{
int tmp =nums[i];//定义一个变量防止本元素(防止循环体内改变循环变量)
if(tmp==bfr){//两个元素相等,重复元素放在数组第一个位置
ret[0]=bfr;
}
else if(tmp - bfr >1){//如果是错误元素则相邻两元素肯定相差2,前面的元素+1就是丢失的数字
ret[1] = bfr+1;
}
bfr = nums[i];//查找完一次,查找下一个,然后将前面元素放置本元素,将本元素+1到下一个元素
}
if(nums[numsSize-1]!=numsSize)//如果最终都没有找到丢失的数字,那就是最后一个数字
{
ret[1] = numsSize;
}
*returnSize =2;
return ret;
}