消失的数字
Posted yumoz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消失的数字相关的知识,希望对你有一定的参考价值。
题目
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解释
数组中包含0到n所有整数,但就缺少了一个,所以,针对这个问题有下列方法给出:
方法1:求和求差法
- 先计算0-n所有数之和。
- 再计算数组中所有元素之和。
- 做差
代码如下:
`
求和法
int n = numsSize+1;
int ret1= 0;
for(int i = 0; i<n; ++i)
{
ret1 += i;//sum
}
int ret2 = 0;
for(int j = 0; j<numsSize; ++j)
{
ret2 +=nums[j];//sum of array
}
return ret1-ret2;
`
方法2:位运算法
思路:使用位运算的异或运算来排除。
- 数组中元素0-n缺少一个。
- 在造一组数0-n。
- 前面两组数全部异或,结果就是所求的缺少的数。
代码如下:
`
//位运算
int x = 0;
for(int i = 0;i<numsSize+1; ++i)
{
x^=i;//x先和所有数异或一次
}
for(int j = 0;j<numsSize; ++j)
{
x ^= nums[j];//继续异或数组中所有元素
}
return x;
`
总结
针对此类问题,求和求差法体现了数学的思维,位运算的巧妙在于可以使用异或去除重复两次出现的数,最后剩下的数自然就是出现一次的数。
如若各路大神还有更好的思路,请分享。
以上是关于消失的数字的主要内容,如果未能解决你的问题,请参考以下文章
焦点在 EditText 上时 ViewPager2 片段内容消失