如何实现对数组的去重

我们今天来学习如何实现对一个数组的去重,我们以洛谷排序题单里面的 P1059 [NOIP2006 普及组] 明明的随机数为例,给大家讲解一下如何实现对数组的去重,那废话就不说了,我们来看题👇

题目描述

这道题目的本质很简单,就是去重+排序

题目会给我们一个可能带有重复元素的数列,而我们要做的就对这个数列进行去重操作(将其中重复的元素去掉,只保留一个),这就有点类似于我们学过的集合,最后我们再将这个不含有重复元素的数列元素的个数输出并且输出这个数列本身就可以了。

解法一

解析

首先大家会想到的办法就是对这个数组进行遍历,然后逐个比较是否相同,相同的"去掉"就可以了,这当然是一种简单粗暴的思路,并且这种办法也可以AC,并不会TLE,所以是可行的。

首先我们想到的就是先开一个数组,把数列里面的数字逐个存放进来,然后用for循环嵌套的格式对数组元素进行遍历和比较,那发现相同元素直接让后面的元素等于0,然后让计数器num+1吗?很明显是不合理的,因为可能会出现下面的情况👇

大家可以发现,如果有三个2,那么在外层循环第一次到2的时候,我们会进行两次数据,num由0变成了2,这是合理的;但当外层循环第二次到刚刚的2的时候,问题出现了——他会再检查一次,发现存在0,然后num又会+1,这是不合理的。

故此,我们要跳过已经被变成0的元素,这样才能保证计数器num的值不出问题。

既然这个问题解决了,按这道题也就简单了,附上AC代码👇

C++代码

#include <bits/stdc++.h>            //万能头文件
using namespace std;
int main()
{
    int n,i,j,num=0;
    cin >> n ;
    int a[n];                //开一个数组存放数列
    for(i=0;i<n;i++){
        cin >> a[i] ;        //导入数列
    }
    for(i=0;i<n;i++){
        if(a[i]==0){            //判断是否已经被修改为0
            continue;            //修改过的直接跳过进行下一次循环
        }else{
            for(j=i+1;j<n;j++){
            if(a[i]==a[j]){        //判断是否为相同元素
                a[j]=0;            //相同就改为0进行标记
                num++;            //计数器+1
                }
            }
        }
        
    }
    sort(a,a+n);            //进行sort快排
    cout << n-num << endl ;        //输出去掉相同元素后的数据个数
    for(i=num;i<n;i++){            //相同元素都为0放在了数组最前面,从非重复元素开始输出
        cout << a[i] << " ";        
   }
    return 0;
}

这就是第一种解法,也是大家最容易想到的一种解法,唯一要注意的就是对于计数器数值的保护。希望大家看了我的题解能有一些帮助❀

解法二

接下来给大家介绍一个黑科技——unique() 函数,unique是独一无二的意思,它的功能也像它的名字一般是进行去重操作的

unique()函数介绍

unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。

大家看了以上的解释,一定对这个函数的用途有了一些了解,那么这个函数到底是如何使用的?

unique()函数使用说明

unique(x,y,z)

x:类同sort函数的第一个参数,表示数组开始执行unique操作的首地址

y:类同sort函数的第二个参数,表示数组停止执行unique操作的下一个地址

z:类同sort函数的第三个参数,表示自定义元素是否相等的标准,可以省略不写,默认为a=b就是a=b

但是,你也可以自己书写z的内容,比如自己规定a的个位和b的个位相同即为相同

解析

那我们知道了unique()函数的用法之后,我们就可以尝试使用它来解决这个题了

我们要先进行排序再使用unique()函数,这样我们才能够将全部的重复元素去掉

那就上代码👇

C++代码

#include <bits/stdc++.h>                //万能头文件
using namespace std;
int main()
{
    int n,i,k;
    cin >> n ;
    int a[n];
    for(i=0;i<n;i++){
        cin >> a[i] ;        //将数列导入数组
    }
    sort(a,a+n);            //先进行sort快排,使重复元素相邻
    k=unique(a,a+n)-a;        //将数组进行去重处理并将去重后数组的长度存入k
    cout << k <<endl ;
    for(i=0;i<k;i++){
        cout << a[i] << " ";
    }
    return 0;
}

以上就是这道题目的第二中解法,是不是非常简单,几行代码就直接搞定~

希望我的题解对大家有所帮助,谢谢大家的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值