数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。时间复杂度O(n)
由于时间复杂度要求为O(n),采取异或的做法。
举例说明:
数组{1,0,3},缺失数字是2.
用二级制的方法表示出这几个数字,这里只看后4位置即可:
1:0001
0:0000
3:0011
定义0-n的数字组成一个数组num
两个相同的数字异或为0(不需要考虑顺序),那么nums数组所有的数和num数组所有数异或之后,相同的约掉,剩下的数字就是我们要找的数。
代码如下:
#include<stdio.h>
int missingNumber(int* nums, int numsSize)
{
int i = 0;//nums中的下标位置
int res = numsSize;//不能是0,否则多按位异或一次0
for (i = 0; i < numsSize; i++)
{
res = res ^i ^ nums[i];
}
return res;
}
int main()
{
int num[] = {
5,4,3,1,2,6,7,9,0};
int n = 0;
n = sizeof(num) / sizeof(num[0]);//求numsSize
int p = missingNumber(num, n);
printf("缺失的数字是:%d\n", p);
return 0;
}
运行结果: