错误的集合(初阶C语言刷题)

目录

1. 题目描述

2. 解题思路

3. 代码实现

4.完结散花


1. 题目描述

错误的集合(初阶C语言刷题)_第1张图片

https://leetcode.cn/problems/set-mismatch/description/该题目的链接放这里哦~

2. 解题思路

1.当我们读完题目后,我们知道我们要做俩件事,一就是找到丢失的数字重复的数字放到一个数组中并输出。

2.我们要注意到的是题目并没有告诉我们这个错误的集合是一个有序(升序)的数组,所以我们不妨将这个错误的数组先进行排序。

3.当我们将这个数组进行升序后,我们会很轻松的知道重复的数字是紧挨在一起的,那我们就只要从数组开端开始判断相邻俩个元素是否相同,若相同那我们就找到重复的元素了。

4.我们也可以很轻松的注意到数组元素与数组下标的关系就是n(元素)=i(数组下标)+1

那我们是不是就只要判断n==i+1就可以了呢?如果!=那我们是不是就找到丢失的元素了呢?代码这样实现~

错误的集合(初阶C语言刷题)_第2张图片

5.其实这种思路是没有问题的,但我们还要注意到有重复元素,所以我们要在找到重复元素后将其后面的元素整体往前挪一位覆盖前面的一个重复元素(画个图理解一下)

错误的集合(初阶C语言刷题)_第3张图片

这种情况我们可以知道缺失的数字是4,好像不用往前覆盖就可以找到,那如果是这样呢?

错误的集合(初阶C语言刷题)_第4张图片

如果我们不往前覆盖的话,上面的代码逻辑求出来丢失的元素就是3了。

错误的集合(初阶C语言刷题)_第5张图片

3. 代码实现

再让我们结合整体代码加深一下理解吧~

int* findErrorNums(int* nums, int numsSize, int* returnSize) 
{
int i=0;
int j=0;
int* errorNums =malloc(sizeof(int) * 2);
for(i=0;inums[j])
        {
        int tmp=0;
        tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
        }
    }
}//排序
for(i=0;i

注意:在leetcode上这个题目只注重核心逻辑代码的实现(数据都不用自己给),main函数在系统后台,这里呈现的是一个函数。

还要注意到malloc是动态开辟的内存(上面是在堆上开辟了一块8字节的内存空间),不会因为函数的调用结束而被回收掉,而是需要手动的调用free把空间释放掉(如果我们在函数中使用平常的方式开辟一片空间存放数组errorNums,随着函数的调用结束,开辟的空间会被系统回收掉。)

错误的集合(初阶C语言刷题)_第6张图片

4.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

你可能感兴趣的:(初阶C语言刷题,c语言,开发语言)