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。
就是那个消失的数字!