Hrbust-1287-数字去重和排序(set可轻易解决)

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 

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;
}

 

おすすめ

転載: blog.csdn.net/qq_24016309/article/details/88700384