zoukankan      html  css  js  c++  java
  • 数组去重操作

    数组去除重复值是面试常考内容,也是很容易用到的一个技巧,下面就几种去重的方法进行介绍。

    首先是最常见的方法,也就是添加一个临时数组,将原数组遍历,加入临时数组,每次加入时判断待加入的元素是否存在于临时数组中,代码如下:

    1. // 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组  
    2. //第一种方法,遍历,将没有的插入临时数组  
    3. function uniqArray1(arr) {  
    4.     var n=[];  
    5.     for(var i=0;i<arr.length;i++){  
    6.         //如果当前项已经保存到了临时数组,则跳过,否则加入  
    7.         if(n.indexOf(arr[i])==-1){  
    8.             n.push(arr[i]);  
    9.         }  
    10.     }  
    11.     return n;  
    12. }  

    那么还有没有更好的办法呢?可以采用哈希表的思想,在JavaScript中,对象的查找比数组下标的查找要快很多倍。所以我们可以创建一个对象专门来存放已加入临时数组的元素,那么每次加入新的元素时就可以通过查找对象来判断是否重复了,代码如

     
    1. //第二种方法,使用哈希表  
    2. function uniqArray2(arr){  
    3.     var n={},//哈希表  
    4.         r=[];//零时数组  
    5.     for(var i=0;i<arr.length;i++){  
    6.         if(n[arr[i]]==null){//如果哈希表中没有,则添加到哈希表,且进入临时数组  
    7.             n[arr[i]]=true;  
    8.             r.push(arr[i]);  
    9.         }  
    10.     }  
    11.     return r;  
    12. }  

       HASH了解----> http://www.cnblogs.com/dolphin0520/

    还有一种方法,虽然速度没有哈希表快,但是比最基本的indexOf来的快,思想就是先经过排序函数sort,再比较相邻的元素,不同的就加到临时数组中。代码如下

     
    1. //第三种方法,先排序,再比较邻接部分  
    2. function uniqArray3(arr){  
    3.     arr.sort();  
    4.     var r=[arr[0]];  
    5.     for(var i=1;i<arr.length;i++){  
    6.         if(arr[i]!=r[r.length-1]){//由于已经经过了排序,所以相邻的是相同的  
    7.             r.push(arr[i]);  
    8.         }  
    9.     }  
    10.     return r;  
    11. }  
           hash了解:    http://www.cnblogs.com/dolphin0520/
      1. //验证数组去重函数的使用  
      2.         var arr=[2,3,4,2,4,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3];  
      3.         for(var i=0;i<10000000;i++){//为了分辨出花费时间的区别,特此增加数组的长度  
      4.             arr.push(3);  
      5.         }  
      6.         var time1=Date.now();  
      7.         var n1=uniqArray1(arr);  
      8.         var time2=Date.now();  
      9.         console.log(n1);//2,3,4,5说明第一种去重成功  
      10.         console.log(time2-time1);//218  
      11.           
      12.         time1=Date.now();  
      13.         var n2=uniqArray2(arr);  
      14.         time2=Date.now();  
      15.         console.log(n2);//2,3,4,5说明第二种去重成功  
      16.         console.log(time2-time1);//63,说明对象下标的引用要比indexOf搜索快得多  
      17.           
      18.         time1=Date.now();  
      19.         var n3=uniqArray3(arr);  
      20.         time2=Date.now();  
      21.         console.log(n3);//2,3,4,5说明第三种去重成功  
      22.         console.log(time2-time1);//203,说明sort方法使用快排,比indexOf快,但是没有哈希快 
  • 相关阅读:
    2017校赛 问题 F: 懒人得多动脑
    2017校赛 C: 不爱学习的小W【模拟】
    方程解的个数【数论】
    小兔蹦蹦跳【脑洞】
    例2-2显示文字
    例2-6 数值转换列表
    例2-3 转换数值
    例2-1 输出文字
    例1-1 求n!
    #文件1向文件中输出字符数据——fgetc
  • 原文地址:https://www.cnblogs.com/Jane77/p/7446980.html
Copyright © 2011-2022 走看看