错误的集合(力扣刷题)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-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 
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));//只能有一个丢失的数和重复的数
 }

错误的集合(力扣刷题)_第1张图片

由于VS2022不支持变长数组,所有我就只能输入一个固定的数。 

 

 

你可能感兴趣的:(C语言,算法,leetcode,c语言)