【C语言】每日一题(错误的集合)

最近在牛客、力扣上做题,花费海量时间,苦不堪言,有时绞尽脑汁也想不出,痛定思痛,每日记录写的比较困难的题。
错误的集合
【C语言】每日一题(错误的集合)_第1张图片
题目如上图所示

题主乍看之下觉得很简单,再看例子,不就是一个有序数组找重复和缺的吗,感觉很快就可以秒杀,殊不知,我已经死了。
看到例子之后题主先入为主,带偏了自己。注意审题!!

方法1:暴力循环,通过内层与外层双重for循环,因为题目明确说明是1~n的整数

static int arr[2];
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    *returnSize=2;
    int i=0;
    int j=0;
    for(i=1;i<=numsSize;i++)//外层循环,从1开始
    {
        int count=0;//计数器
        for(j=0;j<numsSize;j++)
        {
           if(i==nums[j])
             count++;//对于i,出现相同时+1,正常情况下,count为1
        }
         if(count==2)//当为2时,说明出现重复
            arr[0]=i;
         if(count==0)//为0时,缺失
            arr[1]=i;
    }
    return arr;
}

方法2.
利用冒泡排序(因为我学艺不精只会冒泡排序),将数组改写为有序数组,此时,
求重复数时,只需要遍历数组,与前一个比较即可得到
求被覆盖的数时
要进行分类讨论
1.当是开头丢失时

当是22时 比较nums[0]与1

2.当是末尾丢失时

当是1233时 比较nums[numssize-1]与numssize

3.当处在中间时
与前或后作差为2
例如

当是1224时 4-2=2
当为1334时 2-1=2

static int arr[2];
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    *returnSize=2;
    int i=0;
    int j=0;
    int tmp=0;
    for(i=0;i<numsSize-1;i++)//冒泡排序
    {
        for(j=0;j<numsSize-1-i;j++)
        {
            if(nums[j]>nums[j+1])
            {
                tmp=nums[j];
                nums[j]=nums[j+1];
                nums[j+1]=tmp;
            }
        }
    }
    for(i=0;i<numsSize-1;i++)//找重复
    {
        if(nums[i]==nums[i+1])
        {
            arr[0]=nums[i];
            break;
        }
    }
     //找被覆盖的数,然后分情况
    if(nums[0]!=1)
        arr[1]=1;
    if(nums[numsSize-1]!=numsSize)
        arr[1]=numsSize;
    for(i=1;i<numsSize;i++)
    {
        if(nums[i]-nums[i-1]==2)
        {
            arr[1]=nums[i]-1;
            break;
        }
    }
    return arr;
}

以后每天更新,若有不对请及时指出

你可能感兴趣的:(c语言,数据结构,算法)