出题人发现自己要记的密码越来越多,为了解决这个问题,他为每个密码设置了4位数的PIN,通过某种规则去生成对应的密码,这样就可以减轻记忆负担,可是他把有些PIN设置成重复的了,希望你可以帮他删除这些重复的PIN,只剩下不重复的PIN。注意删除后需要保持原来的顺序。如果他原来的PIN全部失效了,请你输出”oh my pins“(不含引号)
输入
一个整数T(代表样例数量,1<=T<=100)
每个样例包含两行,一行是一个整数,代表PIN的数量N(1<=N<=2000),第二行N个整数,代表PIN(四位数,可能包含前导0).
输出
如果还有PIN,包含两行,第一行输出还有多少PIN
第二行输出剩余这些PIN。如果PIN全部失效,请输出”oh my pins“(不含括号,占一行)
关键是找出如何存储这些pin码以及存储表示这些pin码出现的次数,我们这里可以将这些pin码看作是一个int整数,在输出的时候使用 %04d就可以了。
这里我开了两个数组去存储,cnt用来存出现的次数,它的下标是具体的pin码,再用一个p来存储每个pin码;最后用一个vector容器遍历整个cnt并存储cnt == 1的pi。
输出的时候注意,最后一个pin码背后是没有空格的。注意我的代码最后的输出行。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
vector<int> solve;
int cnt[N];
int p[N];
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
solve.clear();
int n;
cin >> n;
for(int i = 0; i < N; i ++) cnt[i] = 0;
for(int i = 0; i < n; i ++)
{
cin >> p[i];
cnt[p[i]] ++;
}
for(int i = 0; i < n; i ++)
if(cnt[p[i]] == 1) solve.push_back(p[i]);
if(solve.size())
{
printf("%d\n%04d", solve.size(), solve[0]); // 解决输出问题
for(int i = 1; i < solve.size(); i ++)
printf(" %04d", solve[i]);
cout << endl;
}
else puts("oh my pins");
}
return 0;
}