查找重复元素

题目描述

找出数组 arr 中重复出现过的元素
示例1

输入

[1, 2, 4, 4, 3, 3, 1, 5, 3]

输出

[1, 3, 4]

第一种::运用reduce的第二个参数初始化allEle为{}后计算出数组中所有元素出现的次数,

然后循环判断出现次数大于1的元素放入新数组。

function duplicates(arr) {
    var m = arr.reduce(function(allEle,curEle,index,arr){
        if(curEle in allEle){
            allEle[curEle]++;
        }else{
            allEle[curEle] = 1;
        }
        
        return allEle;
    },{});
    var n = [];
    for(v in m){
        if(m[v] > 1){
            n.push(v);
        }
    }
    return n;
}

第二种::用reduce对allEle进行初始化为数组后,判断allEle中不存在的元素放入,如果allEle中存在说明是重复出现的元素

并不在n数组中则放入新数组n最后返回。
function duplicates(arr) {
    var n = [];
    var m = arr.reduce(function(allEle,curEle,index,arr){
        if(allEle.indexOf(curEle) === -1){
            allEle.push(curEle);
        }else if(allEle.indexOf(curEle) !== -1 && n.indexOf(curEle) === -1){   //allEle.indexOf(curEle) !== -1  可以去掉了
            n.push(curEle);
        }
        
        return allEle;
    },[]);
   
    return n;
}

第三种::循环数组每一个元素的顺序出现的位置和逆序出现的位置是否一致,位置相同代表不具备相通元素,否则具备。

然后再判断新数组m中是否有这个元素,没有则加入新数组。
function duplicates(arr) {
    var m = [];
    arr.forEach(function(ele,index,arr){
        if(arr.indexOf(ele) !== arr.lastIndexOf(ele) && m.indexOf(ele) === -1){
            m.push(ele);
        }
    });
    return m;
}

第四种::运用sort()对数组进行排序后过滤filter()数组,判断排序后的当前元素的前一个和后一个元素的是否相同,

和前一个元素相同说明重复,如果和后一个如果还相同则说明已经在第一次出现的时候return过true啦!!!
function duplicates(arr) {
    return arr.sort().filter(function(_,i){
        return arr[i] === arr[i + 1] && arr[i] !== arr[i - 1];
    }
  );
}

第五种::对数组每个元素进行遍历,并比较这个元素后边的每个元素是否有相同的,在碰到相同的时候还要判断是否存在,不存在则放入新数组arr1。

其实我觉得这个还是蛮繁琐的,比较的次数明显增多。
function duplicates(arr) {
  var arr1=[];
  for(var i=0;i<arr.length;i++){
    for(var j=i+1;j<arr.length;j++){
      if((arr[i]==arr[j]) && (!arr1.contains(arr[i]))){
       arr1.push(arr[i]);
        break;
      }
    }
  }
  return arr1;
}
Array.prototype.contains = function (obj){
  var i = this.length;
  while(i--){
    if (this[i] === obj){
      return true;
    }
    return false;
  }
}

第六种::
/* 时间复杂度为O(n)算法。
思路:遍历数组,将数组的元素和数组出现的次数分别作为对象属性和值。遍历对象,取出
次数大于1的即可。 */
function duplicates(arr) {
    var obj = {};
    var repeatList = [];
    //遍历数组,将数组的值作为obj的索引,出现次数为值
    arr.forEach(function(item){
        if(obj[item]){
            obj[item] +=1;
        }else{
            obj[item] = 1;
        }
    });
    //获取对象自身属性的keys
    var propertyNames = Object.getOwnPropertyNames(obj);
    //遍历对象,将重复出现的元素取出
    propertyNames.forEach(function(item){
        if(obj[item] > 1){
            repeatList.push(parseInt(item));
        }
    });
    return repeatList; 
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值