Description
用计算机随机生成了N个0到1000000000(包含0和1000000000)之间的随机整数(N≤5000000),对于其中重复的数字,只保留一个,把其余相同的数去掉。然后再把这些数从小到大排序。 请你完成“去重”与“排序”的工作
Input
输入有2行,第1行为1个正整数,表示所生成的随机数的个数: N
第2行有N个用空格隔开的正整数,为所产生的随机数。
Output
输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
Sample Input
10
20 40 32 67 40 20 89 300 400 15
Sample Output
8
15 20 32 40 67 89 300 400
这题的本意应该是用哈希拉链法做,但是我并没有彻底弄懂哈希拉链法的使用方法,有一个步骤我看不懂(应该是我太菜了),后来学了set以后发现可以用set做,而且非常简单。
#include<iostream>
#include<stdio.h>
#include<iterator>//迭代器是有头文件的
#include<set>///已重复元素不会再次插入,并且插入元素会自动排序。神特么好用,以后用这个就完事了
using namespace std;
int main()
{
long long n,a,i;
set<long long>q;
while(scanf("%lld",&n)!=EOF)
{
q.clear();///清空容器
set<long long>::iterator nano;//迭代器指针的使用,先定义是什么容器的,定义什么型的,定义名字
for(i=1; i<=n; i++)
{
scanf("%lld",&a);
q.insert(a);//装入容器
}
printf("%d\n",q.size());///size返回的是一个值,目测是一个int型的值,因为%lld会输出奇怪的东西
printf("%lld",*q.begin());///而begin和end返回的是一个地址,因此begin需要指针或者迭代器承接,或者加上*运算符再输出
for(nano=++q.begin(); nano!=q.end(); nano++)///set中的地址是随输入连在一起的所以可以用自增地址来移动指针
{
printf(" %lld",*nano);///end()返回的是容器中最后一个值的后面那个!不是最后一个值!
}
printf("\n");
}
return 0;
}