位图3:缺失数字

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位图3:缺失数字相关的知识,希望对你有一定的参考价值。

从0,1,2,...,n这n+1个数中选择n个数,找出这n个数中缺失的那个数,要求O(n)尽可能小。

 1. 位运算求解

题中的意思就是从数字[0,n]之间的n+1个数字少了一个,而其他的数字都存在。

如果我们把这个数组添加从0~nn+1个元素,就变成了数组中只有一个数出现了一次,其他数字都出现了2次,让我们求这个只出现一次的数字。这题使用位运算是最容易解决的,关于位运算有下面几个规律:

1^1=0;
1^0=1;
0^1=1;
0^0=0;

也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到:

a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律

有了这3个规律,这题就很容易解了,我们只需要把所有的数字都异或一遍,最终的结果就是我们要求的那个数字。来看下代码:

 public int solve(int[] nums) {
        int xor = 0;
        for (int i = 0; i < nums.length; i++)
            xor ^= nums[i] ^ (i + 1);
        return xor;
    }

或者还可以这样写,原理都是一样的:

  public int solve(int[] nums) {
        int xor = 0;
        for (int i = 0; i < nums.length; i++)
            xor ^= nums[i] ^ i;
        return xor ^ nums.length;
    }

2.求和

如果不缺那个数字的话,这个数组的所有数字可以组成一个等差数列,我们只需要根据公式求和,然后再减去数组中所有的数字即可,代码如下

 public int solve(int[] nums) {
        int length = nums.length;
        int sum = (0 + length) * (length + 1) / 2;
        for (int i = 0; i < length; i++)
            sum -= nums[i];
        return sum;
    }

以上是关于位图3:缺失数字的主要内容,如果未能解决你的问题,请参考以下文章

代码题(40)— 缺失的第一个正数缺失数字

将位图从片段保存到内部/外部存储[关闭]

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)

Leetcode 41 缺失的第一个整数

LeetCode. 缺失数字

使用后续突变和缺失片段中继 commitUpdate 回调