#include <stdio.h>
#define N 10
int main()
{
int a[N-1]={3,9,4,5,2,6,1,8,10}, missing=0;
for(int i=1; i<=N-1; i++)
{
missing+=i-a[i-1];
}
missing+=N;
printf("Missing Number: %d\n", missing);
return 0;
}
对于丢失一个数的情况:
1)用1+2+...+n减去当前输入数据的总和。时间复杂度:O(n) 空间复杂度:O(1) 【容易溢出】
2)用12...*n除以当前输入数据的总积。时间复杂度:O(n) 空间复杂度:O(1) 【容易溢出】
3)用1^2^...^n的结果在逐个异或当前输入数据。时间复杂度:O(n) 空间复杂度:O(1)
4)对输入数据排序,然后从头到尾遍历一次。时间复杂度O(nlogn) 空间复杂度O(1)
5) 对输入数据进行Hash,然后从头到尾遍历一次。时间复杂度O(n) 空间复杂度O(n)
#include <iostream>
using namespace std;
void main()
{
int N=10;
int num[]={1,10,4,5,6,2,8,9,3};
int k=0;
for(int i=1; i<N; i++)
{
k ^= i^num[i-1];
}
printf("%d\n", k^N);
}
丢了两个数的情况,使用hash表,占用空间较大。。。
#include <stdio.h>
#include <string.h>
#define N 10
#define MISSNUM 2
int main()
{
int a[N-MISSNUM]={3,9,5,2,6,1,8,10};
int flag[N];
memset(flag, 0, sizeof(flag));
for(int i=0; i<=N-MISSNUM-1; i++)
{
flag[a[i]-1]=1;
}
for(int i=0; i<=N-1; i++)
{
if(flag[i]==0)
{
printf("Missing Number: %d\n", i+1);
}
}
return 0;
}