消失的数字

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:求和求差法

  1. 先计算0-n所有数之和。
  2. 再计算数组中所有元素之和。
  3. 做差

代码如下:
`
求和法

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:位运算法

思路:使用位运算的异或运算来排除。

  1. 数组中元素0-n缺少一个。
  2. 在造一组数0-n。
  3. 前面两组数全部异或,结果就是所求的缺少的数。

代码如下:
`
//位运算

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 片段内容消失

ActionBar 菜单项在嵌套片段中消失

为啥这段代码会泄露? (简单的代码片段)

在我的 android 应用程序中滚动列表视图时,数据正在消失。我在片段中使用列表视图

26个jQuery代码片段使用技巧