原题链接https://www.acwing.com/problem/content/3480/
题目描述
给定一个包含 n 个整数的数组,请你删除数组中的重复元素并将数组从小到大排序后输出。
输入格式
第一行包含一个整数 n。
第二行包含 n 个不超过 1000 的正整数。
输出格式
输出去重和排序完毕后的数组。
数据范围
1≤n≤1000
输入样例:
6
8 8 7 3 7 7
输出样例:
3 7 8
思路:
1,这里简单来说就是实现数组去重。数组去重可以使用unique
函数,它的使用前提是有序,然后参数是,去重数组的(首位,末位的下一位),会返回不重复的元素的个数;
这里要注意的是,它的内部实现就是将前面的重复元素用不重复的替代,但是并不是消去,只是将其移至后面而已,整体数组元素个数不变;
2,我们也可以自己写去重算法,不过也是要先排序的。
使用unique
函数
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int q[N];
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
sort(q,q+n);//排序
n = unique(q,q+n)-q;//返回不重复元素的个数
for(int i=0;i<n;i++)
printf("%d ",q[i]);
}
自己实现去重
就是在有序的前提下,跟前面的不一样那么我们就记录下来,也就是找到第一个不同的数并记录;
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int q[N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i]);
}
sort(q+1,q+n+1);
int j=1;//第一个元素一定是不同的
for(int i=2;i <= n;i++)
{
if(q[i]!=q[i-1])
q[++j]=q[i];//所以先++,因为第一个本来就是不同的
}
for(int i=1;i<=j;i++)
printf("%d ",q[i]);
}
也可以这样:
同样也是记录前面的不一样元素,这里采用j
,j就是相同元素的第一个,然后不同的那么我们就记录;
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int q[N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i]);
}
sort(q+1,q+n+1);
int j=1;
for(int i=2;i <= n;i++)
{
if(q[i]!=q[j])//都是一个道理,就是和前面的不一样
q[++j]=q[i];
}
for(int i=1;i<=j;i++)
printf("%d ",q[i]);
}