查找数组中缺失的数字(头歌)

任务描述

在大小为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语句,使其结果最后没有空格,如果只是想了解这个题目的解法,这点可以忽略😋😋😋。

   

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值