明明的随机数(小明的调查作业)

明明的随机数

又名:小明的调查作业

题目描述

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

输入格式

输入有2行,第1行为1个正整数,表示所生成的随机数的个数:N。

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

输出格式

输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。


样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400

解法一

  首先应该可以很快想到一个浅显的方法:读入数据并且进行标记,若标记则存入vector,反之跳过,最后sort。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,vis[1005];
 4 int main ()
 5 {
 6     vector<int> v;
 7     cin>>n;
 8     for(int i=0;i<n;i++)
 9     {
10         int x;
11         cin>>x;
12         if(vis[x]==0)
13         {
14             v.push_back(x);
15             vis[x]=1;
16         }
17     }
18     sort(v.begin(), v.begin() + v.size()); 
19     cout<<v.size()<<endl;
20     for(int i=0;i<v.size();i++)
21     {
22         cout<<v[i]<<" ";
23     }
24     return 0;
25 }

  有些注意事项:

  • 第3行,将变量(数组)定义为全局,让系统自动初始化,主要是防止vis内有一些奇怪的数字,可能会导致第12行的判断失误;
  • 第18行,必须“+v.size()”而非n,因为在排序之前已经进行了去重,所以长度不一定还是n

解法二

  其实并不需要vector的辅佐,只需要维护vis数组即可。每当输入一个数字,就 vis[输入的数字]=1; ,在标记完之后,循环判断&输出;每次判断vis[i]是否为1,若为1则输出i(下标),之所以直接输出下标,是因为下标是顺序的,就免去了排序~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,vis[1005];
 4 int main ()
 5 {
 6     cin>>n;
 7     for(int i=1;i<=n;i++)
 8     {
 9         int t;
10         cin>>t;
11         vis[t]++;
12     }
13     int cnt=0;
14     for(int i=0;i<1000;i++)
15     {
16         if(vis[i]!=0)
17         {
18            cnt++;
19         }
20     }
21     cout<<cnt<<endl;
22     for(int i=0;i<1000;i++)
23     {
24         if(vis[i]!=0)
25         {
26             cout<<i<<" ";
27         }
28     }
29     cout<<endl;
30     return 0;
31 }

解法三

  还有一种相对“高级”的写法,用set。set有俩特性,一是存入数据时自动去重,而是存入后自动排序。量身定制的题目哇!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main ()
 4 {
 5     set<int> s;
 6     int n;
 7     cin>>n;
 8     for(int i=1;i<=n;i++)
 9     {
10         int x;
11         cin>>x;
12         s.insert(x);
13     }
14     cout<<s.size()<<endl;
15     for (set<int>::iterator it = s.begin(); it != s.end(); it++) 
16     {
17         cout << *it << " ";
18     }
19     return 0;
20 }

若阁下喜欢,赏一赞可否?

感谢您的阅读o(* ̄▽ ̄*)ブ

原文地址:https://www.cnblogs.com/DYXM/p/13508054.html