一.问题描述
在实际编程中我们经常遇到“去掉重复数字”等类似的问题,也就是“ Remove the duplicate ”问题。例如在“ 建立某个统计样本时,要去掉重复的元素 ”。下面将给出这类问题的解决思路。
二.解决思路
解决上述问题基本上有三种思路:
第一种使用map容器过滤掉重复元素(适用于整形数据、字符串等)
第二种:利用数组进行去重, 首先对该组数据进行 排序 ,然后从头遍历数组,判断当前位置的数据和下一个位置的数据是否重复,若不重复,添加下一位中的数据到过滤后的数组中,并把比较的基准数据设置为刚加入的这个数据,然后继续进行比较。若重复,则跳过该数据去比较后面的(也可以做字符串的比较),需要使用两个指针(一个基准指针,一个游标指针);
第三种: 是对第二种方法的改进,第二种方法需要开辟新的空间存储过滤后的元素,此方法中不需要开辟空间,只需用数组中没有重复的元素把重复的元素覆盖,过程如下:

(1)基准指针首先指向数组第0个位置,游标指针指向第1个位置,比较两指针所指向的数据是否相等,若相等,游标指针向后移一位,基准指针不动,再次比较;若不相等,游标指针所指向的数据复制到基准指针的下一位,基准指针和游标指针各自从当前位置向后移一位,再次比较;
(2)终止条件:游标指针超过数组的最后一位;
(3)当前基准指针之前的一段数组则为去重后的数组(包括基准指针所指向的元素);
三.代码实现
1.map容器去重实现代码
#include<iostream>
#include<map>void inserttomap(int *a, int n,std::map<int, int> &outmap);
void sprintmap(std::map<int, int> &coutmap);
void main()
{int a[10] = { 1, 1, 2, 3, 4, 4, 5, 6, 6, 8 };std::map<int, int> resultmap;inserttomap(a, 10, resultmap);sprintmap(resultmap);system("pause");
}
void inserttomap(int *a, int n, std::map<int, int> &outmap)
{std::map<int, int> testmap;std::pair< std::map< int, int >::iterator, bool > ret;for (int i = 0; i < n; i++){ret = testmap.insert({ a[i], 1 });if (!ret.second){++testmap[a[i]];}}outmap = testmap;
}void sprintmap(std::map<int, int> &coutmap)
{auto map_it = coutmap.cbegin();while (map_it!=coutmap.cend()){std::cout << "元素" << map_it->first << "出现的次数为" << map_it->second <<std::endl;++map_it;}
}

2.开辟数组空间去重实现代码
和第三种方法类似,在此不在赘述;
3.不开辟数组空间去重代码
#include<iostream>
#include <algorithm>
void removemultip(int *a, int n, int &cout);void main()
{int a[10] = { 1, 1, 2, 3, 4, 4, 5, 6, 6, 8 };std::sort(&a[0], &a[9]+1);//数组排序int scount;//过滤后数组的有效位长度removemultip(a, 10, scount);for (int i = 0; i <= scount; i++){std::cout << a[i] << std::endl;}system("pause");
}
void removemultip(int *a, int n,int &cout)
{if (n <= 1)return;int start = 0;//基准位置int end = 1; //游标位置while (end<n){if (a[start] == a[end]){++end;}else{a[start + 1] = a[end];++start;++end;}}cout = start;
}

四.思想总结
1.map容器去重的思想
借助map容器中不能插入重复key值的特性进行 常数 或者 字符串 数组去重,又借助map.insert函数的返回值的标识可以统计重复元素出现的个数(在统计一组数据中出现次数最多的元素非常有用);
2. 不开辟数组空间去重的思想
在去重操作实施前要保证数据的有序性,然后通过两个指针在原数组上面进行剔除重复元素,最后截取数组,得到去重后的数组;

去掉数组中重复出现元素的算法相关推荐

  1. php 去掉数组相同元素,php怎么去掉数组中重复的元素

    php去掉数组中重复的元素的方法:可以通过内置函数array_unique()来实现.array_unique()函数可以移除数组中重复的值并返回过滤后的数组.如果数组中存在多个相同元素,则只保留第一 ...

  2. 数组中重复的元素(剑指Offe.03)

    数组中重复的元素(剑指Offe.03) 题目描述: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了 ...

  3. php 查找数组相同元素,查找数组中重复的元素

    本文收集整理关于查找数组中重复的元素的相关议题,使用内容导航快速到达. 内容导航: Q1:在c语言中输入数组两个数组,查找重复元素并输出怎么写啊 可以一次读入N个数据.可以考虑以回车结束读入的一组. ...

  4. php 数组重复最多,PHP获取数组中重复最多元素的简单示例

    这篇文章主要为大家详细介绍了PHP获取数组中重复最多元素的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 本文实例讲述了PHP获取数组中重复最 ...

  5. java 去除数组中重复的元素

    要求:清除数组中重复的元素 思路:因为开始时我以为是不能用集合(使用集合的方式在文章底部),所以绞尽脑汁在不用集合的情况下去除数组中重复的元素,需要些一个去除重复内容的方法,我首先想到的的需要一个存储 ...

  6. php去除数组中重复的元素

    面试上机题 $a = [1, 2, 14, 2, 1] 去除数组中重复的元素,留下元素14 解决思路:要想得到14,必须要先把1和2找到,然后用差集的方法得到14 解: $b = array_uniq ...

  7. C语言 删除数组中重复的元素

    删除数组中重复的元素 举个栗子,输入整数n,然后输入n个整数.直接上代码 #include<stdio.h> int main(void) {int i,n,a[100];int j, t ...

  8. 数组去重——将数组中重复的元素去掉

    一.核心算法 1.创建一个新的空数组,拿旧数组与新数组比较,即遍历旧数组,如果新数组中没有这个元素,就把这个元素添加到新数组中. 2.输出新数组. 二.完整代码 <!DOCTYPE html&g ...

  9. c语言去掉数组中重复的,C语言删除无序整型数组中的重复元素及时间复杂度

    数组重复的问题在任何编程中都会有碰到了,这里介绍C语言删除无序整型数组中的重复元素及时间复杂度,希望对各位有帮助. 遇到一个题,大概要求是写一个函数处理来去掉一个无序的整型数组(例如int i_arr ...

最新文章

  1. 计算机在人力资源管理中的应用论文,计算机人事管理论文
  2. pip install python-docx报错_python各种模块的安装
  3. kafka comsumer
  4. 我的Android学习之旅--1环境配置
  5. Callable与Future的介绍
  6. html5响应式网站优势,响应式网站优势有哪些 真的利于排名优化么
  7. 剖析JavaScript传值
  8. android分析之Binder 01
  9. C语言课后习题(64)
  10. IBM 2nm芯片弯道超车了?他连车都没有
  11. Python 三目运算符(三分支)
  12. 吴恩达神经网络和深度学习-学习笔记-15-局部最优
  13. python的any函数_Python any()函数
  14. vivo X9的usb调试模式在哪里,开启vivo X9usb调试模式的方法
  15. 美国经济数据公布时间
  16. 服务器集群速度文件传输,为什么要实现服务器集群
  17. 解决.bat文件打开是记事本的问题
  18. 多图详解CLH锁的原理与实现
  19. Android 蓝牙手柄 延迟,安卓免设置,0.15s低延迟,飞智银狐蓝牙耳机体验
  20. java数组初始化的方式,java中初始化数组的方式有几种

热门文章

  1. re模块,hashlib模块
  2. Mac 下生成keystore以及获得数字签名
  3. 测试用例的思路---矿泉水瓶
  4. 视频特效-使用ffmpeg滤镜
  5. 重大利好,区块链技术能保护森林资源?
  6. jquery 图片裁剪
  7. 打开office(Word,Excel等)提示“应用程序无法正常启动(0xc0000142)。请单击确认关闭应用程序”
  8. 餐饮巨头被攻击的“致命”48小时
  9. 风影ASP.NET基础教学 6用户控件
  10. cisco链路聚合 不均衡_思科CISCO交换机间链路聚合端口聚合实现方法详解