线上OJ:
【06NOIP普及组】明明的随机数
核心思想:
本题的要求是
1、去重
2、排序
以上两个要求正好可以使用 set 来实现。set 自带了去重和排序的功能。输出时使用 iterator 即可。
解法一、set
#include <bits/stdc++.h>
using namespace std;
int n, x;
set<int> s;
int main()
{
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
s.insert(x);
}
set<int>::iterator it; // 定义指向set的迭代器
printf("%d\n", s.size());
for(it = s.begin(); it != s.end(); it++) printf("%d ", *it); // 输出set中每一个数
return 0;
}
解法二、 sort + unique
我们可以利用sort + unique来完成。
unique是STL函数,包含于 <algorithm> 头文件中。功能是将数组中相邻的重复元素去除。然而其 本质 是 将重复的元素移动到数组的末尾,最后再 将迭代器指向第一个重复元素的下标。
所以,如果利用unique实现去重的功能,需要注意
1、先排序。因为unique只对相邻的重复元素有效;
2、unique并未删除重复元素,只是将重复元素 移动到 数组的 末尾;
3、unique返回的是指向末尾第一个重复元素的迭代器
4、基于第2点和第3点,如果需要知道数组中不重复元素的个数,需要用unique返回的迭代器减去数组的起始地址,即
l e n = u n i q u e ( a , a + n ) − a ; len = unique(a, a+n) - a; len=unique(a,a+n)−a;
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
int a[n];
for(int i = 0; i < n; i++) scanf("%d", &a[i]); // 读入
sort(a, a+n); // 先排序
int len = unique(a, a+n) - a; // 去重,并计算不重复元素的个数
printf("%d\n", len); // 输出长度
for(int i = 0; i < len; i++) printf("%d ", a[i]); // 输出不重复的元素
return 0;
}