任务描述
在大小为n的数组中,仅存在大小为[1,n]的数字,数组中的元素有些出现了两次,有些出现了一次,有的数字没有出现。设计一个算法在空间复杂度为O(1),时间复杂度为O(n)的情况下找到这些没有出现的数字。假设储存结果的数组不算在额外空间之内。
编程要求
输入
多组数据,每组数据有两行,第一行为数组的长度n,第二行为数组的n个元素(元素之间用空格分隔),当n=0时输入结束。
输出
对于每组数据分别输出一行,输出缺失的数据(元素之间用空格分隔),如果数据未缺失,输出Not Found。
测试说明
平台会对你编写的代码进行测试:
测试输入:
8
4 3 2 7 8 2 3 1
6
1 4 2 6 2 4
6
3 2 2 1 3 4
5
1 2 3 4 5
0
预期输出:
5 6
3 5
5 6
Not Found
公主王子们请看代码:
void FindMissNumber(int *a,int n)
{//指定数字组中的位数
/**************begin************/
int b[n+1],flag=0;
for(int i=0;i<n+1;i++)
b[i]=0;//将b数组中所有值赋为0;
for(int i=0;i<n;i++)
{
b[a[i]]=a[i];//用a[i]作为b数组的下标并且将对应的值赋给b[a[i]],方便后续的直接利用b数组的下标来查找缺失数
}
for(int i=1;i<n+1;i++)
{
if(b[i]==0&&flag==1)
cout<<" "<<i;
if(b[i]==0&&flag==0)//b[i]=0则是说明此处缺失,缺失值就是i;
{
flag=1;
cout<<i;
}
}
if(flag==0)
cout<<"Not Found";
cout<<endl;
/**************end************/
}
这道题目的思路就是先建立一个额外的b数组,利用for循环依次将a[i]作为b数组的下标的同时再将a[i]赋值给b[a[i]],利用下标与值相等的关系方便后续查找缺失的数,若是b[i]依旧为0,则说明此处有缺失值,缺失值正好为i。
如果是要在头歌上面提交,头歌的答案每行最后一个数字后面不能有空格,要不然就会不过关,所以第三个for循环中我另外又用了if语句,使其结果最后没有空格,如果只是想了解这个题目的解法,这点可以忽略😋😋😋。