解题思路:
看了一下其他人的思路,感觉分明把一个极其简单题目给认为搞复杂了,题目大致分为两个功能,第一:排序,第二:去重,这与我们C++的STL里面的set方法直接就是重合了好么?
参考代码:
#include<bits/stdc++.h> using namespace std; set<int> se; int main(){ int n; cin>>n; for(int i=0,k;i<n;i++){ cin>>k; se.insert(k); } cout<<se.size()<<endl; for(set<int>::iterator it=se.begin();it!=se.end();it++){ cout<<*it<<' '; } return 0; }
直接解决,而且比其他的代码都快很多。
如果你连STL是什么都不知道的话,请点开这个 https://baike.baidu.com/item/STL/70103?fr=aladdin
简单的来说一下set
一.解释
关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
总结就是a.其存粹数据唯一,无重复数据;b.其存储后会自动排序(默认从小到大)。
二.用法
1.头文件
#include <set>
2.定义 set<type> s;
3.常用操作
set<int> s 定义一个set容器 类型为int型
s.begin() 返回指向第一个元素的迭代器
s.end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
s.clear() 清除所有元素
s.count() 返回bool型,有返回1,无返回0
s.empty() 如果集合为空,返回true
s.erase() 删除集合中的元素
s.find() 返回一个指向被查找到元素的迭代器,如果没找到则返回end()
s.insert() 在集合中插入元素
s.size() 集合中元素的数目
s.swap() 交换两个集合变量
可以说,利用特性就可以快速解决了。
同时提一下,set容器的底层是一颗红黑树,这就说明了其储存并非线性,而是散列性质,这也是其查找的速度要小于O(n)的原因,也同时由于set容器底层是一颗红黑树,就决定了其无法应用于sort这类STL的模板排序方法里面(诶,为什么本身就是排好序的,还需要我再排序呢???),思考一下,如果需要逆序,或者定序排序,则需要怎么做呢?
如果逆序的时候相当简单,只需要再定义的时候加上一个规范就可以了,如:
set<int,less<int>> se; //升序 set<int,greater<int>> se; //降序
但如果是定序呢?当然你可以设置一个定序类型,这样可能比较麻烦,同时,你可以利用一个vector做中间变量进行定序排序,利用第三者完成你想要的功能。
set还有一个兄弟模板
叫做:multiset<type> name;其与set的区别就是set不能存储重复的数据,而multiset可以存储重复的内容。
(STL万岁......没药救了)
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复