【LeetCode力扣645】错误的集合

题目要求:

集合 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值