思路:
首先,这个题使用异或(^)来解决。首先了解几个公式:
a ^ a = 0, a ^ b ^ a = b, a ^ b ^ c = a ^ c ^ b
由此,我们可以概括出以下几个结论:
1. 若两个元素相等,则异或结果为0
2. 所有元素与0异或时,结果均不变
3. 异或运算满足交换律
首先,该题是下面的题的变种:
有2n + 1个数,其中有2n个数出现过两次,找出其中只出现一次的数
该题可将所有的值进行异或运算,因为2n个相同的数的异或结果为0,则2n + 1个数的异或结果为只出现一次的数。
来看我们的原题,arr[n - 1]中存了n - 1个数,每个数都是 1 ~ n之间的数,且没有重复。我们用这n - 1个数再加上 1 ~ n 就变成 2n - 1个数。即为上题。
则该算法的时间复杂度为O(n),只用了额外的常数空间,则空间复杂度为O(1)。
代码如下:
public int getLostNum(int[] arr){
int n = arr.length + 1;
int result = 0;
for(int i = 0; i < n - 1; i++){
result ^= arr[i];
result ^=(i + 1);
}
result ^= n;
return result;
}