1107: ZN的随机数

发布时间 2023-04-08 22:28:18作者: 仨木

题目描述

ZN 想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助 ZN 完成 “去重” 与“排序”的工作。

输入格式

输入数据有多组,每组测试数据有 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数:N

第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。

输出格式

对于每组测试实例,输出 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入

10
20 40 321 67 40 20 89 301 407 15

样例输出

8
15 20 40 67 89 301 321 407



此题由于数据范围都不大,所以方法较多。可以采用桶排序的方法;也可以先排序,再依次找重复的数字
这道题首先要求无重复,之后是排序,因此可以利用C++语言中的set关联容器是最方便的,因此第一种实现方式就是采用set关联容器。
第二种方式也是常用的方法,因为是要有序和唯一的,因此我们可以利用数组来实现,将生成的数看做数组的下角标,如果存在这个数就将数组中的这个元素置1,这样无论有多少个重复的数,该元素都是1,因此实现去重。


方法一:
#include <iostream>
#include <set>
using namespace std;
int main()
{
 int num=0;
 int value;
   while(cin>>num)
   {
       set<int> orgroup;
       for (int i = 0; i<num; i++)
       {
           cin >> value;
           orgroup.insert(value);
       }
       for (auto m=orgroup.begin();m!=orgroup.end();m++)
       {
           cout << *m << endl;
       }
   }
 return 0;
}

方法二:

#include <iostream>
using namespace std;
int main()
{
   int loop;
   while(cin>>loop)
   {
       int num[1001]={0};
       for(int i=0;i<loop;i++)
       {
           int j;
           cin>>j;
           num[j]=1;
       }
       for(int i=0;i<=1001;i++)
       {
           if(num[i]==1)
           {
               cout<<i<<endl;
           }
       }
   }
   return 0;
}