使用异或思想
空间复杂度:O(1)
时间复杂度:O(N)
1.0^x = x;
2.x^x = 0; 同样的数异或两次得到零
3.异或满足交换律
实现思路:
4. 先异或[0,n]的所有数字,再异或nums数字的所有数字:
5. 由于想同的数异或会得到0,并且0异或任意数结果都是任意数,
6. 所以再本题中,异或两次的会被变为0,异或一次的就不会发生变化:那么小时的数字就会出来了 比如:
输入:[3,0,2] :
先异或:0到n的所有数字:X^ 1 ^ 2^3;
再异或数组: X^ 1 ^ 2^ 3 ^ 3^ 0 ^ 2 = 0^ 1^ 2^ 2 ^3 ^3 = 1; 即1是消失的数字。
注:异或0-numsSize的所有数字时需要循环numsSize+1次,异或数组nums时只用循环numsSize次
int missingNumber(int* nums, int numsSize){ //先异或0-numsSize的所有数字 int x = 0; for(int i = 0 ;i<=numsSize;i++){ x ^= i; } //再异或nums数组所有的值 for(int i = 0;i <numsSize;i++){ x ^= nums[i]; } //最后的结果就是消失的数字 return x; }