题目描述
给定 nn 个数,要求把其中重复的去掉,只保留第一次出现的数。
输入格式
本题有多组数据。
第一行一个整数 TT,表示数据组数。
对于每组数据:
第一行一个整数 nn。
第二行 nn 个数,表示给定的数。
输出格式
对于每组数据,输出一行,为去重后剩下的数,两个数之间用一个空格隔开。
输入输出样例
输入 #1复制
2 11 1 2 18 3 3 19 2 3 6 5 4 6 1 2 3 4 5 6
输出 #1复制
1 2 18 3 19 6 5 4 1 2 3 4 5 6
说明/提示
对于 30\%30% 的数据,n \le 100n≤100,给出的数 \in [0, 100]∈[0,100]。
对于 60\%60% 的数据,n \le 10^4n≤104,给出的数 \in [0, 10^4]∈[0,104]。
对于 100\%100% 的数据,1 \le T\le 501≤T≤50,1 \le n \le 5 \times 10^41≤n≤5×104,给出的数在 3232 位有符号整数范围内。
上代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct num{
int id;
int z;
}s[50024];
int read(){
int w=1,q=0;
char ch=' ';
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
return w*q;
}
bool cmz(struct num a,struct num b){
if(a.z>b.z)
return true;
if(a.z==b.z)
if(a.id<b.id)
return true;
return false;
}
bool cmid(struct num a,struct num b){
if(a.id<b.id)
return true;
return false;
}
signed main(void){
int t,n,pd;
t = read();
while(t--){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
s[i].id = i;
s[i].z = read();
}
sort(s+1,s+n+1,cmz);
for(int i=1;i<=n;i+=pd){
pd = 1;
for(int j=i+1;j<=n;j++){
if(s[i].z==s[j].z)s[j].z = -2147483659,pd++;
else break;
}
}
sort(s+1,s+n+1,cmid);
for(int i=1;i<=n;i++){
if(s[i].z!=-2147483659)printf("%lld ",s[i].z);
}
printf("\n");
}
return 0;
}