修改陣列(藍橋杯)
分數 20
作者 liudan
單位 石家莊鐵道大學
給定一個長度為 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。
第二行包含 N 個整數 A1,A2,⋅⋅⋅,AN。
其中,1≤N≤105,1≤Ai≤106。若輸入資料不合理,則輸出:error
輸出格式:
輸出 N 個整數,依次是最終的 A1,A2,⋅⋅⋅,AN。
輸入樣例:
在這裡給出一組輸入。例如:
5
2 1 1 3 4
輸出樣例:
在這裡給出相應的輸出。例如:
2 1 3 4 5
include
include
include <unordered_set>
using namespace std;
void modifyArray(vector
unordered_set
for(int i=0;i<A.size();i++){
while(seen.find(A[i]) != seen.end()){ //表示元素A[i]在集合seen中,屬於是unordered集合中的一種固定用法了
A[i]++;
}
seen.insert(A[i]);
}
}
int main(){
int N;
cin>>N;
if(N<=0||N>100000){
cout<<"error"<<endl;
return 0;
}
vector<int>A(N);
for(int i=0;i<N;i++){
cin>>A[i];
if(A[i]<1||A[i]>100000){
cout<<"error"<<endl;
return 0;
}
}
modifyArray(A);
for(int i=0;i<N;i++){
cout<<A[i];
if(i<N){
cout<<" ";
}
}
return 0;
}