leetcode面试题17.04消失的数字

int missingNumber(int* nums, int numsSize){
    int judge=0;
    int k=0;
    int sum=-1;
    for(int i=0;i<numsSize;i++)
    {
        k=nums[i];
        k=abs(k);
        if(k==numsSize)
        {
            judge=1;
        }
        else
        {
            nums[k]*=(-1);
        }
    }
    if(judge==0)
    return numsSize;
    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]>0||(nums[i]==0&&sum==-1))
        sum=i;
    }
    return sum;
}

在这里插入图片描述
这个题有很多思路可以解决。

我的解法是,将出现的数字作为下标,并将其下标的元素置为负数,然后再次遍历,就能得出结果。

在这里插入图片描述

这个题目的重点在于,将其中最大元素作为下标是越界的。
但是,我们可以通过设置一个变量来判断,这个最大的元素是否在数组中出现。

我们int judge=0;
来作为一个判断的依据。

在第一个循环中,有一个分支语句,当最大元素出现,将judge赋值为1,
否则则将通过正常范围内的下标,把元素置负,方便后续判断。

我们在第一次循环的结束,判断,如果judge==0,则代表最大元素没有出现!
我们立刻将numsSize返回,这就是消失的数字!

如果judge==1,则代表最大元素在数组其中,那么数组中必然存在一位正数,我们则需要把他揪出来!

我们最后进行一次循环!

在最后一次循环中的判断语句中,我们需要注意一个点!
就是元素0,这个点。

我们可以看到,我在程序的最开始,初始化sum为-1,一个在数组中不可能存在的数字,就是为了处理这个0.

if(nums[i]>0||(nums[i]==0&&sum==-1))
sum=i;

在这里插入图片描述
大家可以看到,0是有可能在这个消失的数字坐标上的,而这个时候,我们无法判断他的正负。

但,我们从图中②得知,如果0正好在这个位置上,那么sum在此之前必然不会被赋值,sum=-1就是最好的证明,(倘若在0元素之前就出现了正确答案,那么sum也必然大于等于0);
那么,如果0元素的下标不是那个消失的数字,也无需担心,此后必然会有一个正数,将这个正数的下标赋值给sum即可。

最终,我们返回sum。
就是那个消失的数字!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值