题目要求:
集合 s
包含从 1
到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums
代表了集合 S
发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]
示例 2:
输入:nums = [1,1] 输出:[1,2]
提示:
2 <= nums.length <= 104
1 <= nums[i] <= 104
题目分析:
1.集合s中包含的是1到n的整数,结合数组的思想,我们可以遍历数组找出相同的,但是我们并不确定给定的集合s内的数字是一个有序的,这样一个一个去遍历有点麻烦,而且题目只要求我们找出重复的数字和丢失的数字,我们可以先将数组内的数据重新排序为升序数组,我们可以考虑使用冒泡排序或者qsort函数。
2.题目所要求的是返回重复数字和丢失数字的数组,因此我们可以额外再创建一个数组用来存储并返回。
3.使用循环遍历数组,分支语句判断要求,将符合的值存入新建数组之中。
代码实现与解析:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 函数比较
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
// int* nums - 所传过来判定的数组
// int numsSize - 数组的大小
// int* returnSize - 返回的数组大小
//将所传数组进行升序排序
qsort(nums, numsSize, 4, cmp_int);
//创建额外数组存放重复值和丢失值,static延长其生命周期防止销毁
static arr[2] = { 0 };
//创建函数变量
int cur = 0;//当前值
int pre = 0;//前一个值
//循环遍历数组
int i = 0;
for (i = 0; i < numsSize; i++)
{
cur = nums[i];//使当前值为数组首元素
if (cur == pre)//记录重复的数值
{
arr[0] = cur;
}
else if (cur - pre > 1)//记录丢失的数值
{
arr[1] = pre + 1;
}
pre = cur; //向后推进
}
if (nums[numsSize - 1] != numsSize)//如果遍历完前面的数值没有问题,那么一定是最后一个出了问题,最后一个数值一定为数组的大小
{
arr[1] = numsSize;
}
*returnSize = 2;
return arr;
}
//主函数
int main()
{
int nums[] = { 1,2,2,4 };
int sz = sizeof(nums) / sizeof(nums[0]);
int i = 0;
int* arr = findErrorNums(nums, sz, &i);
for (int j = 0; j < i; j++)//打印输出
{
printf("%d ", arr[j]);
}
return 0;
}