1.将所有对应的位置a[i]的下标i未使用过的i存到v2中,其余的存到v1中
2.加一个特判如果v2里有两个以上的元素再进行该步:
将对应位置的数循环填入,比如a[1],a[2]都满足第一步中的存入v2条件,那该步就把1放a[2]中,2放入a[1]中
3.存到v1中的元素循环填入a即可
#include <bits/stdc++.h>
//#define int long long
#define endl '\n'
#define debug cout << "fuck" <<endl;
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f,N=2e5+5;
typedef pair<int, int> PII ;
#define x first
#define y second
map<int,int> mp;
int a[N];
vector<int> v1,v2;
void solve() {
int n;
cin>>n;
mp.clear();
v1.clear();
v2.clear();
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]++;
}
for(int i=1;i<=n;i++)
if(mp.count(i)==0)
{
if(a[i]!=0) v1.push_back(i);
else v2.push_back(i);
}
int cnt = 0;
if(v2.size()>1){
v2.push_back(v2[0]);
for(auto it = v2.begin();it!=(v2.end()-1);it++)
a[*it] = *(it+1);
}
else if(v2.size()==1) a[v2[0]]=v1[0],v1[0]=v2[0];
for(int i=1;i<=n;i++)
if(a[i]==0)
a[i]=v1[cnt++];
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
signed main()
{
int t;
cin >> t;
while(t -- ) {
solve();
}
return 0;
}
时间复杂度O(n)