[蓝桥杯2019初赛]修改数组
题目描述
给定一个长度为N 的数组A = [A1, A2,…,AN],数组中有可能有重复出现的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,…, AN。
当修改Ai 时,小明会检查Ai 是否在A1~ Ai-1 中出现过。
如果出现过,则小明会给Ai 加上1 ;
如果新的Ai 仍在之前出现过,小明会持续给Ai 加1 ,直到Ai 没有在A1~Ai-1中出现过。
当AN 也经过上述修改之后,显然A数组中就没有重复的整数了。
现在给定初始的A 数组,请你计算出最终的A 数组。
输入
第一行包含一个整数N(1<=N<=100000)
第二行包含N个整数A1,A2,…,AN(1<=Ai<=1000000)
输出
输出N个整数,依次是最终的A1,A2,…,AN
样例输入 Copy
5
2 1 1 3 4
样例输出 Copy
2 1 3 4 5
我自己的代码,过了80%
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int num[1000001];
bool vis[1000001],flag;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
vis[i]=false;
}
flag=true;
for(int i=1;i<=n;i++){
flag=true;
while(flag){
//cout<<num[i]<<' '<<vis[num[i]]<<endl;
if(!vis[num[i]]) {
vis[num[i]]=true;
flag=false;
}
else{
num[i]++;
}
}
}
for(int i=1;i<=n;i++){
if(i==1){
cout<<num[i];
}
else{
cout<<' '<<num[i];
}
}
return 0;
}
大佬的代码:
#include <iostream>
#include <cstring>
using namespace std;
int a[100001];
int b[2000001];
int main()
{
int n;
memset(b,0,sizeof(b));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
while(b[a[i]])
{
int t=a[i];
a[i]+=b[a[i]];
b[t]++;
}
b[a[i]]=1;
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}
参考博客:https://blog.csdn.net/lclovezy/article/details/104583446