数字去重和排序II
Time Limit: 4000 MS Memory Limit: 65536 K
Total Submit: 1098(320 users) Total Accepted: 431(281 users) Rating: Special Judge: No
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容器的使用
STL中的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;
}