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

leetcode面试题17.04消失的数字_第1张图片
这个题有很多思路可以解决。

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

leetcode面试题17.04消失的数字_第2张图片

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

我们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;

leetcode面试题17.04消失的数字_第3张图片
大家可以看到,0是有可能在这个消失的数字坐标上的,而这个时候,我们无法判断他的正负。

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

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

你可能感兴趣的:(Numa,CS,Lerning,Evolution-C,c语言,开发语言,后端)