位图3:缺失数字
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位图3:缺失数字相关的知识,希望对你有一定的参考价值。
从0,1,2,...,n这n+1个数中选择n个数,找出这n个数中缺失的那个数,要求O(n)尽可能小。
1. 位运算求解
题中的意思就是从数字[0,n]
之间的n+1
个数字少了一个,而其他的数字都存在。
如果我们把这个数组添加从0~n
的n+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:缺失数字的主要内容,如果未能解决你的问题,请参考以下文章