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

最近在牛客、力扣上做题,花费海量时间,苦不堪言,有时绞尽脑汁也想不出,痛定思痛,每日记录写的比较困难的题。
错误的集合
在这里插入图片描述
题目如上图所示

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

方法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;
}

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

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值