查重函数unique
头文件#include <algorithm>
unique(数组名+起始地址,数组名+结束地址(左闭右开区间,对整个数组查重可以理解为数组名,数组名+数组长度))
对于长度为n的数组a,unique(a,a+n)-a返回的是去重后的数组长度
注意函数只能对区间内相邻的元素进行查重删除,所以应该对数组先排序,再查重。如果题目不要求对数组进行排序则另当别论。
1118.明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
每组输入有2行,第1行为1个正整数,表示所生成的随机数的个数N,第2行有N个用空格隔开的正整数,为所产生的随机数。
输出格式
每组输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入样例
1020 40 32 67 40 20 89 300 400 15
输出样例
815 20 32 40 67 89 300 400
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N,a[100];
cin>>N;
for(int i=0; i<N; i++)
{
cin>>a[i];
}
sort(a,a+N);
int n=unique(a,a+N)-a;
cout<<n<<endl<<a[0];
for(int j=1;j<n;j++)
{
cout<<" "<<a[j];
}
return 0;
}
如不使用unique函数,用两个数组去重代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N,M,a[100],b[100],i,j;//定义两个数组手动去重
cin>>N;
a[0]=b[0]=0;//数组下标从0开始,为了方便我们不要a[0],
//这样数组下标就对应着数组中存储的有用数据的个数
M=0;//b[]数组中的元素个数
for(i=1;i<=N;i++)
{
cin>>a[i];
for(j=1;j<=M;j++)//循环遍历b[]数组
{
if(b[j]==a[i])//如果已经存在了相同元素就跳出
//提前跳出循环一定是j<=M
break;
}//执行完一整个遍历正常结束满足j>M,
if(j>M)//也就是在b[]数组中没有与a[i]元素相同的
{
b[j]=a[i];//此时的j是一个新下标,b[j]中没有元素,新元素保存至b[j]
M++;//M计数,用于循环b[]数组的条件
}
}
sort(b+1,b+M+1);//函数排序,因为[0]下标的元素位置没有使用,
//现在M与数组下标编号相同,所以数组长度与下一个元素地址是M+1
cout<<M<<endl<<b[1];
for(i=2;i<=M;i++)
{//元素用空格隔开,现将第一个元素输出,以后的元素输出前先输出“ ”
cout<<" "<<b[i];
}
cout<<endl;
return 0;
}