题目
数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:[3,0,1] 输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1] 输出:8
题目源地址:https://leetcode-cn.com/problems/missing-number-lcci/
解题思路
本题因为限制了时间复杂度,所以不能用排序的方法解决,下面提供一个利用异或性质的解题思路
异或(^)性质:
1.两个相同的数异或后为零 2^2=0
2.零和某数异或后仍为某数 2^0=2
3.异或有交换律
所以可以将数组的数和0-n的数进行异或,得到的数就是缺失的数,又因为异或有交换律,即没有先后顺序,所以可以先用x=0和数组异或,再将x和0-n的数异或,最后x即为所求。
int missingNumber(int* nums, int numsSize) {
int x = 0,i;
for (i = 0; i < numsSize; i++)
{
x ^= nums[i];
}
for (i = 0; i < numsSize + 1; i++)
{
x ^= i;
}
return x;
}