[JLOI2011] 不重复数字
题目描述
给定 n n n 个数,要求把其中重复的去掉,只保留第一次出现的数。
输入格式
本题有多组数据。
第一行一个整数 T T T,表示数据组数。
对于每组数据:
第一行一个整数 n n n。
第二行 n n n 个数,表示给定的数。
输出格式
对于每组数据,输出一行,为去重后剩下的数,两个数之间用一个空格隔开。
样例 #1
样例输入 #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\% 30% 的数据, n ≤ 100 n \le 100 n≤100,给出的数 ∈ [ 0 , 100 ] \in [0, 100] ∈[0,100]。
对于 60 % 60\% 60% 的数据, n ≤ 1 0 4 n \le 10^4 n≤104,给出的数 ∈ [ 0 , 1 0 4 ] \in [0, 10^4] ∈[0,104]。
对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 50 1 \le T\le 50 1≤T≤50, 1 ≤ n ≤ 5 × 1 0 4 1 \le n \le 5 \times 10^4 1≤n≤5×104,给出的数在 32 32 32 位有符号整数范围内。
思路
以下是使用集合来解决此问题的思路:
1、首先,我们需要将所有给出的数存储在一个无序集合中。我们可以使用C++中的set()函数来完成此操作。
2、我们可以使用find来检查它是否已经在集合中出现过。如果已经出现,则无需任何处理,继续后面的数据输入。
3、我们将只包含第一次出现的元素的新集合写入并且输出。
代码
#include <bits/stdc++.h>
#include <set>
using namespace std;
#define debug(x) cout<<#x<<" = "<<x<<endl
#define endl "\n"
typedef long long LL;
const int N = 1e5;
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
bool pd=1;
set <LL>arr;
for(int i=0;i<n;++i)
{
LL shuru;
scanf("%lld",&shuru);
if(pd)
{
cout<<shuru;
arr.insert(shuru);
pd=0;
}
else
{
if(arr.find(shuru)==arr.end())
{
printf(" %lld",shuru);
arr.insert(shuru);
}
}
}
printf("\n");
}
return 0;
}