将空位数字存起来,然后顺序插入,如果不能插入就插入下一个空缺的数字,当最后一个插入的数字大于n时,说明前面的插入策略有问题导致最后一个数无处可插,随便找前面一个插入的数交换即可
C++ 代码
#include<iostream>
using namespace std;
const int N=200010;
int a[N],b[N];
int main()
{
int T,n,f;
scanf("%d",&T);
while(T--)
{
cin>>n;
for(int i=0;i<=n;i++)
b[i]=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
}
for(int i=0,j=1;i<n;i++)
{
while(b[j]!=0)j++;
if(a[i]==0)
{
if(j!=i+1)
{
a[i]=j;
j++;
}
else
{
f=j+1;
while(b[f]!=0)f++;
a[i]=f;
b[f]++;
if(f>n)
{
for(int k=1;k<n;k++)
if(b[k]==0)
{
for(int l=0;l<n;l++)
if(a[l]==k)
{
a[i]=a[l];
a[l]=j;
break;
}
break;
}
}
}
}
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
真棒啊