题目
1、数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。
示例1:
输入:[3,0,1]
输出:2
示例2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
思路1
解析
首先,题目中说道是0-n个数字里面缺少一个,我们可以将n个数字进行排序,然后再遍历整个数组,就可以找出其中缺少的数字。
比如示例1:
先将[3,0,1]进行排序,得到[0,1,3],然后将数组与n个数字进行比较,不同的就是要找的数字。
代码:
int missingNumber(int* nums, int numsSize){
//将数组中的所有数字进行冒泡排序
for(int i=0;i<numsSize-1;i++)
{
int j=0;
for (j=0;j<numsSize-1-i;j++)
{
if(nums[j]>nums[j+1])
{
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
//将数组中的所有值跟N个数进行比较
int ret=0;
for (int i = 0;i<numsSize;i++)
{
if(ret==nums[i])
{
ret++;
}
}
return ret;
}
其中最需要注意的是排完序的比较环节。
弄清楚for循环语句中判断语句为啥是i<numsSize,而不是i<numsSize+1。这非常重要。
思路2
解析
题目中明确表明是0-n个数字中缺少一个,我们可以选择将0-n个数字相加,然后减去数组中所有的数的和,这样就能够得到那个消失的数字了。
比如示例1:
先将[3,0,1]中的每一个数字进行相加得到结果4,又因为数组的长度为3,
所以我们需要计算0、1、2、3这四个数的和,结果为6。
然后用6-4=2,所以这个2就是我们要找的消失的数字。
代码:
int missingNumber(int* nums, int numsSize){
//计算0-N之间数字的和
int ret1=0;
int N=numsSize+1;
for (int i=0;i<N;i++)
{
ret1+=i;
}
//计算nums数组中所有数字的和
int ret2=0;
for(int i=0;i<numsSize;i++)
{
ret2+=nums[i];
}
return ret1-ret2;
}
这一种发方法就简单了许多!
思路3
解析
采用异或的方法找出,题目中消失的数字。
两个相同的数异或得零。先将0-N个数进行异或得到一个ret,然后再将ret与所给数组中的每个数字进行异或,
最后所得的数字就是我们所求的数字。
代码:
int missingNumber(int* nums, int numsSize){
int ret=0;
int N = numsSize+1;
for(int i=0;i<N;i++)
{
//计算出0-N之间所有数的异或值
ret^=i;
}
for(int i=0;i<numsSize;i++)
{
//相同的数异或为0,所以最后只剩下消失的数字
ret^=nums[i];
}
return ret;
}
该方法的难点就是:需要了解异或的计算,以及异或的特点,只要弄清楚这些,这个方法还是比较简单的。
总结
这个题目从我自身的角度来说,第二种和第三种是最好理解和操作的,第一种思路虽然比较清晰,但是再代码实现的时候,我自己出现了一些小问题,比较的那块代码出现了一些问题,主要还是自己的动手能力差了一些,以后继续加油。看着挺简单的,但是实际上花费了一点时间。
这也是我第一篇的博客,刚开始以为会比较容易,过程中却出现了一些阻碍。果然不能够眼高手低,还是要将自己所想的记录下来,才是真正转换成为自己的东西。
我相信那些诗和远方,会慢慢来到你的身边!