P4305 [JLOI2011] 不重复数字——不要直接用unordered_map无序输出
题目描述
给定 \(n\) 个数,要求把其中重复的去掉,只保留第一次出现的数。
输入格式
本题有多组数据。
第一行一个整数 \(T\),表示数据组数。
对于每组数据:
第一行一个整数 \(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\%\) 的数据,\(n \le 100\),给出的数 \(\in [0, 100]\)。
对于 \(60\%\) 的数据,\(n \le 10^4\),给出的数 \(\in [0, 10^4]\)。
对于 \(100\%\) 的数据,\(1 \le T\le 50\),\(1 \le n \le 5 \times 10^4\),给出的数在 \(32\) 位有符号整数范围内。
正解
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
for (int k=0;k<t;k++) {
int n;
cin>>n;
unordered_set<int> myset;
vector<int> myvector;
for (int i=0;i<n;i++) {
int a;
cin>>a;
if(myset.find(a)==myset.end()) {
myvector.push_back(a);
myset.emplace(a);
}
}
for (int num:myvector) {
cout<<num<<" ";
}
cout<<endl;
}
}
错解
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
for (int k=0;k<t;k++) {
int n;
cin>>n;
unordered_set<int> myset;
for (int i=0;i<n;i++) {
int a;
cin>>a;
myset.emplace(a);
}
vector<int> myvector;
for (auto num:myset) {
myvector.push_back(num);
}
for (int i=myvector.size()-1;i>=0;i--) {
if(i<myvector.size()-1) cout<<" ";
cout<<myvector[i];
}
cout<<endl;
}
}
浙公网安备 33010602011771号