数组去重

原创 2016年12月31日 11:51:37
面试时经常被问到数组去重的问题,个人觉得这种问题其实没太大的作用,毕竟在实际工作中很少能遇到的很大的数组,所以不论以什么样的方式实现都很难做到内存的溢出及产生较大的耗时差距(除非你是故意),这里以2的13次方乘以10个数组项为例,在不改变原数组的前提下,做了几种没考虑效率及内存的方法,仅以实现为目的

        {
            function createTestArray(){
                const testArray=[1,2,3,4,5,'a','b','c','d','e'];
                for(let i=0;i<13;i++){
                    testArray.push(...testArray);
                }
                testArray.sort((a,b)=>Math.random()>0.5?1:-1);
                //console.log(`testArray:${testArray},length:${testArray.length}`);
                return testArray;
            }
            const testArray=createTestArray();

            function showTime(fun){
                const start=new Date();
                const result=fun();
                return `name:${fun.name},time:${new Date()-start},result:${result.join(',')}`;
            }

            function removeRepeatBySet(){
                return [...new Set(testArray)];
            }

            function removeRepeatByFilter(){
                return testArray.filter((item,index,arr)=>arr.indexOf(item)==index);
            }

            function removeRepeatByForof(){
                const obj={},arr=[],value={};
                for(let i of testArray){
                    if(obj[i]==value){
                        continue;
                    }else if(obj[i]!=value){
                        obj[i]=value;
                        arr.push(i);
                    }
                }
                return arr;
            }

            function removeRepeatByFor(){
                const obj={},arr=[],value={};
                for(let i= 0,len=testArray.length;i


执行10次的执行结果


[
    "name:removeRepeatByFilter,time:10,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:10,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:12,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:6,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:7,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:7,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:8,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFilter,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:2,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:3,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:4,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:5,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByFor,time:6,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:11,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:6,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:6,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:7,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:8,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatByForof,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:10,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:13,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:16,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:6,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:7,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:7,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:8,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d",
    "name:removeRepeatBySet,time:9,result:3,5,a,b,1,4,c,2,e,d"
]


从执行时间上看,for循环是用时最少的,其次for of,filter,而es6的Set用时最长

数组去重的五种方法

需求描述:为Array类型添加公共方法Unique,去掉给定数组中的重复元素。 五种方法: /*方法一*/ //为Array类型的prototype对象添加unique1方法 Array....
  • St_Sp_En
  • St_Sp_En
  • 2017年04月18日 17:49
  • 1095

数组去重(c语言实现)

起因 在九度练习acm的时候,有道题我认为应该先进行数组去重操作,由于工作中我大部分都是用php写代码,php中数组去重只要一个array_diff()函数即可实现,但是到C语言中,我就没有现成的a...
  • zinss26914
  • zinss26914
  • 2012年10月16日 00:03
  • 16458

C/C++面试之算法系列--去除数组中的重复数字

   去除数组中的重复数字 Sailor_forever  sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/200...
  • sailor_8318
  • sailor_8318
  • 2008年10月12日 03:07
  • 17353

C# asp.net中字符串数组去重

 public static void Purge(ref ListneedToPurge)        {                        for(int i=0;i        ...
  • chunquanwang
  • chunquanwang
  • 2010年04月21日 13:42
  • 1313

对一个数组的数进行 去重

int n = 11; int a[] = { 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5 }; n = unique(a, a + n) - a;//使用STL自带去重函数,返回...
  • chuanyu
  • chuanyu
  • 2016年11月11日 18:44
  • 879

数组去重,简短而有效的方法

var arr = [1,2,3,4,5,6,7,8,1,2,3,4,5,12,13,14,15]; /* js对象里没有重复的key,所以可以通过以下方法来解决数组去重 ...
  • u013415353
  • u013415353
  • 2016年07月03日 00:20
  • 251

数组去重方法大全

原文链接:再见,重复的你(数组去重)思路一:双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组Array.prototype.distinct = functio...
  • a214161398a
  • a214161398a
  • 2016年05月15日 13:19
  • 4116

面试:数组去重方法简单总结~

双重循环 var arr = [1,5,3,1,9,8,5,4,2,3]; // 需要去重的数组 var list = []; // 用来存结果数组 for(var i=0;i...
  • qq_31164127
  • qq_31164127
  • 2017年04月27日 14:40
  • 394

数组去重的四种方法

去掉Javascript的Array的重复项的四种方法 1.Array.prototype.unique1 = function() { var n = []; //一个新的临时数组 fo...
  • fuckof
  • fuckof
  • 2016年08月19日 16:18
  • 1571

JS数组去重2017

现在要求去重下面这个数组 [1, 2, 3, 3, 3, '0', '1', '2', '测试', '重复', '重复', NaN, NaN, false, false]; 方法一:ES6 Se...
  • zhalcie2011
  • zhalcie2011
  • 2017年06月06日 14:58
  • 502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组去重
举报原因:
原因补充:

(最多只允许输入30个字)