题目地址:
https://www.lintcode.com/problem/missing-integer/description
给定一个长度为
n
n
n的数组,内含的数字是
0
∼
n
0\sim n
0∼n,但缺且仅缺
1
1
1个。将其求出。题目中的数组元素都是一个叫BitInteger
的类,其本质是一个
32
32
32位整数,提供了一个方法返回其右起第
i
i
i位是
0
0
0还是
1
1
1,其中
i
i
i从
0
0
0开始计数。
注意到所有 32 32 32位整数关于异或运算形成一个阿贝尔群,且每个元素阶都为 2 2 2(除了 0 0 0的阶是 1 1 1),单位元为 0 0 0(证明参见https://blog.csdn.net/qq_46105170/article/details/104082406),我们想到将所有数组中的数字都异或一遍,再与 1 ∼ n 1\sim n 1∼n异或一遍,即得结果。代码如下:
import java.util.List;
public class Solution {
/**
* @param array a BitInteger list
* @return an integer
*/
public int findMissing(List<BitInteger> array) {
// Write your code here
int res = 0;
for (BitInteger bitInteger : array) {
for (int j = 0; j < 32; j++) {
res ^= bitInteger.fetch(j) << j;
}
}
for (int i = 0; i < array.size(); i++) {
res ^= i + 1;
}
return res;
}
}
class BitInteger {
public static int INTEGER_SIZE = 31;
public int fetch(int j) {
.... // return 0 or 1, fetch the jth bit of this number
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。