一个0~N的数组中少了一个数字,编写程序找到它,满足时间复杂度O(n)。
提供两种方法实现;
1、加减实现
-因为这个数组的元素是0~N,且只少一个(少的假设为X,0<=X<=N),那么这个数组的所有元素相加结果就等于N*(1+N)/2 -X。那么X=N*(1+N)/2 -(N*(1+N)/2 -X)。也就是用一个完整的减去一个残缺的,结果就是缺失的那一部分。
代码实现如下:
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 8, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int sum = 0;
int sumarr = 0;
int x = 0;
for (i = 0; i <= sz; i++)//计算0~N的和
{
sum += i;
}
for (i = 0; i < sz ; i++)//计算0~N的和减去X
{
sumarr += arr[i];
}
x = sum - sumarr;
printf("消失的数字是:%d\n", x);
return 0;
}
2、异或实现
异或的实现方法:
定义一个int x;让x与arr数组里的每一个元素异或,再与0~N的每一个数字进行异或,我们都知道相同的数字异或两次结果等于0,所以最后的结果就是缺少的数字。
代码实现:
#include<stdio.h>
int main()
{
int arr[] = { 1,9, 2, 3, 4, 5, 6, 7, 8 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int x = 0;
for (i = 0; i <=sz; i ++)//异或0~N的数字
{
x ^= i;
}
for (i = 0; i < sz; i ++)//数组里的元素与0~N的数字异或
{
x ^= arr[i];
}
printf("单身狗:%d\n", x);
return 0;
}