题目链接:Click here
题意:给你t个数,合法的数为只出现在1~t之间,没有重复出现的数。要求你将不合法的数该为合法的数。
思路:将给的数中出现的数标记起来,重复或出界的数存到另一个数组中,在从1~t循环查找未标记的数,将不合法的数改为该数。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;
int a[100005];
int b[100005];
int f[100005];
int main()
{
int t, x;
while(scanf("%d", &t)!= EOF)
{
x = 1;
memset(f, 0, sizeof(f));
for(int i = 1; i <= t; i++)
{
scanf("%d", &a[i]);
if(f[a[i]] == 0 && a[i] <= t)
f[a[i]] = 1;
else
{
b[x] = i;
x++;
}
}
x--;
for(int i = t; i > 0; i--)
{
if(f[i] == 0)
{
a[b[x]] = i;
x--;
}
}
for(int i = 1; i < t; i++)
printf("%d ", a[i]);
printf("%d\n", a[t]);
}
return 0;
}