题目链接:
点击打开链接
题意:给出一个数字n,接下来是n个数,把其中的重复的数或者大于n的数进行替换,使得整个数列是由1~n来组成的,可能会有多种答案,输出其中任意一种。
题解:每次输入是判断是否小于等于n,并且第一次出现。若是就把结果保存在res数组中。然后再遍历一遍res数组,去处理那那些未处理的。在标记数组中找到最小的没用过的数字。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//给出一个数字n,接下来是n个数,
//把其中的重复的数或者大于n的数进行替换,
//使得整个数列是由1~n来组成的,可能会有
//多种答案,输出其中任意一种。
const int maxn = 1e5 + 5;
int a[maxn],book[maxn];
int res[maxn];
int main(){
int n;
cin >> n ;
memset(res,-1,sizeof(res));
memset(book,0,sizeof(book));
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
if(!book[a[i]] && a[i] <= n){
res[i] = a[i];
book[a[i]]++;
}
}
// for(int i = 1 ; i <= n ; i ++)
// cout << res[i] << endl;
int minpos = 1;
for(int i = 1 ; i <= n ; i ++){
if(res[i] == -1){
for(int j = minpos ;j <= n ; j ++){
if(!book[j]){
minpos = j+1;
res[i] = j;
book[j] ++;
break;
}
}
}
}
for(int i = 1 ; i <= n ; i ++ )
cout << res[i] << " ";
cout << endl;
return 0;
}