数组的去重笔记

原题链接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]);
    
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值