个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客
由于作者比较菜,还没学malloc这个函数,因此这个题目只写一些与原题大致的思路。
题目链接:645. 错误的集合 - 力扣(LeetCode)
题目:
集合
s
包含从1
到n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组
nums
代表了集合S
发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]示例 2:
输入:nums = [1,1] 输出:[1,2]
思路:
我们肯定得一个一个的去排查。那怎么排查呢?我们要创建应该数组产生从1~n的数。然后一个一个的比较,最后得出结果。 但是这个题目有一个误导的点,就是这个原来的数组不一定是有序的,需要我们自己将这个数组排成有序,这里我们就想到了冒泡排序。(升序或者降序都可以)
nums//这个是错误的数组
numsSize//这个是错误数组的元素个数
实现:
我们就可以先来把这个数组进行排序。
int i = 0;
for (i = 0; i < numsSize - 1; i++)//趟数:要排的数-1
{
int j = 0;
for (j = 0; j < numsSize - 1 - i; j++)//每一趟要做的事
{
if (*(nums + i) > *(nums + i + 1))//如果不满足升序就得交换
{
int tmp = *(nums + i);
*(nums + i) = *(nums + i + 1);
*(nums + i + 1) = tmp;
}
}
}
接下来就开始一个一个的比较 。
int count1 = 0;//记录重复出现的数
int count2 = 0;//记录丢失的数
for (i = 0; i < numsSize; i++)
{
if (*(nums + i) != (i + 1))
{
count1 = *(nums + i);
count2 = (i + 1);
}
}
找到了,就可以打印在屏幕上。
printf("重复出现的数是:%d\n", count1);
printf("丢失的数是:%d\n", count2);
#include <stdio.h>
void findErrorNums(int* nums, int numsSize)
{
//冒泡排序
int i = 0;
for (i = 0; i < numsSize - 1; i++)//趟数:要排的数-1
{
int j = 0;
for (j = 0; j < numsSize - 1 - i; j++)//每一趟要做的事
{
if (*(nums + i) > *(nums + i + 1))//如果不满足升序就得交换
{
int tmp = *(nums + i);
*(nums + i) = *(nums + i + 1);
*(nums + i + 1) = tmp;
}
}
}
int count1 = 0;//记录重复出现的数
int count2 = 0;//记录丢失的数
for (i = 0; i < numsSize; i++)
{
if (*(nums + i) != (i + 1))
{
count1 = *(nums + i);
count2 = (i + 1);
}
}
printf("重复出现的数是:%d\n", count1);
printf("丢失的数是:%d\n", count2);
}
int main()
{
int arr[] = { 1,2,2,4 };//可以自己输入想要排查的数
int sz = sizeof(arr) / sizeof(arr[0]);
findErrorNums(arr, sz);
return 0;
}
如果我们想要输入排查的数,就可以这样写。
int n = 0;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++)
{
scanf("%d", (arr + i));//只能有一个丢失的数和重复的数
}
由于VS2022不支持变长数组,所有我就只能输入一个固定的数。