题目:从0, 1, 2, ..., n 选出不同的n个数,找出未选中的哪一个。
Given nums = [0, 1, 3]
return 2
.
分析:
0,... n 中有 n + 1个数, 所以有一个数没有选中。
我们知道 a xor a = 0, 然后,在这里,我们将数组中的值,与下标进行异或。
以[0, 1, 3] 为例,
下标为0, 1, 2, 3 (额外增加的)
值为 0, 1 , 3
那么就可以两两消掉了,剩下的单个的即missing number。
显示了位运算的巧妙性。
复杂度:
时间复杂度:0 (n)
空间复杂度:0 (1)
代码:
public int missingNumber(int[] nums) {
int xor = 0;
for (int i = 0; i < nums.length; i++) {
xor ^= i;
xor ^= nums[i];
}
xor ^= nums.length;
return xor;
}