首页 > 试题广场 >

查找重复元素

[编程题]查找重复元素
  • 热度指数:148506 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
找出数组 arr 中重复出现过的元素(不用考虑返回顺序)
示例1

输入

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

输出

[1, 3, 4]
推荐
将传入的数组arr中的每一个元素value当作另外一个新数组b的key,然后遍历arr去访问b[value],若b[value]不存在,则将b[value]设置为1,若b[value]存在,则将其加1。可以想象,若arr中数组没有重复的元素,则b数组中所有元素均为1;若arr数组中存在重复的元素,则在第二次访问该b[value]时,b[value]会加1,其值就为2了。最后遍历b数组,将其值大于1的元素的key存入另一个数组a中,就得到了arr中重复的元素。
function duplicates(arr) {
     //声明两个数组,a数组用来存放结果,b数组用来存放arr中每个元素的个数
     var a = [],b = [];
     //遍历arr,如果以arr中元素为下标的的b元素已存在,则该b元素加1,否则设置为1
     for(var i = 0; i < arr.length; i++){
         if(!b[arr[i]]){
             b[arr[i]] = 1;
             continue;
         }
         b[arr[i]]++;
     }
     //遍历b数组,将其中元素值大于1的元素下标存入a数组中
     for(var i = 0; i < b.length; i++){
         if(b[i] > 1){
             a.push(i);
         }
     }
     return a;
 }

编辑于 2015-08-18 21:19:47 回复(59)
function duplicates(arr) {
    let obj = {};
    let newarr = [];
    arr.map(item=>{
        if(obj[item]){
            newarr.push(item);
        }else{
            obj[item] = item;
        }
    })
    return [...new Set(newarr)];
}
发表于 2021-06-09 17:50:43 回复(0)
let a = arr; a.sort((c, d) => { return c - d; }); console.log(a); var flag = null; var out = []; for (let cc = 0; cc < a.length; cc++) { if(a[cc] == flag){ if(a[cc]!=out[out.length-1]){ out.push(a[cc]) } } flag = a[cc] } return out; 通过比较大小排序 然后通过看临近的一位和后一位是否相似来进行比较从而得到
发表于 2021-06-07 20:04:47 回复(0)
  function duplicates(arr) {
        var obj={};
        var ar=[]
        for(var i=0;i<arr.length;i++){
            if(!obj[arr[i]]){
                obj[arr[i]]=1;
            }
            else{
                obj[arr[i]]++;
                ar.push(arr[i]);
                if(obj[arr[i]]>=3){
                    ar.pop();
                }
            }
        }
        return ar;
  }
用一个对象来保存是否存在这个数,如果存在就将它放到一个新的数组中,同时要保证不能同一个数多次放入
发表于 2021-05-18 20:18:26 回复(0)
function duplicates(arr) {
    let newArr =[]
  arr.forEach(item=>{
      if(!newArr.includes(item)&&arr.filter(j=>j===item).length>1){
newArr.push(item)          
      }
  })
    return newArr
}
发表于 2021-05-17 22:02:21 回复(0)
1、遍历一遍可以统计出所有元素重复的次数了,这里只需要记录有重复的元素即可
function duplicates(arr) {
    let obj={};
    let arr1=[];
    arr.map(v=>{
        if(obj[v]==1){//已经出现过1次了
           obj[v]++;//下次再出现不记录了
           arr1.push(v);
        }else{
           obj[v]=1;
        }
    })
    return arr1;
}

发表于 2021-05-09 10:30:18 回复(0)
遍历arr数组Set后的集合,indexOf和lastIndexOf不一致则说明该元素在arr中有多个。

function duplicates(arr) {
    var newArr = [];
    var set_1 = new Set(arr);
    set_1.forEach(function(val, index) {
        if (arr.indexOf(val) != arr.lastIndexOf(val)) {
            newArr.push(val);
        }
    })
    return newArr;
    
}
发表于 2021-05-06 16:22:25 回复(0)
//先去重,在循环去重后的通过原数组转成字符串match查找
function duplicates(arr) {
    let brr=[...new Set(arr)]
    let crr=[]
    brr.forEach(v=>{
        let reg=new RegExp(`${v}`,'g')
        let err=arr.join('').match(reg)
        if(err.length>1){
            crr.push(v)
        }
    })
    return crr
}
发表于 2021-04-15 08:18:52 回复(0)
很简单的一个想法:先判断有没有重复的,有的先删除
再判断原先是不是独自一个的,是的删掉
function duplicates(arr) {
    for(i=0;i<arr.length;i++){
        item = arr[i]
        count = 1
        for(j = i+1;j<arr.length;j++){
            if(arr[j] == item){
                count = 2
                arr.splice(j,arr[j])
            }
        }
        if(count == 1)
            arr.splice(i,arr[i])
    }
    return arr.sort()
}
发表于 2021-04-06 16:52:02 回复(0)
function duplicates(arr) {
    let baseArr = []
    let outArr = new Set()
    for(let i in arr){
        if(baseArr.includes(arr[i])){
            outArr.add(arr[i])
        }else{
            baseArr.push(arr[i])
        }
    }
    
    return [...outArr]
}
利用Set防止去重,利用...解构 ,利用includes判断是否存在item
发表于 2021-03-31 21:47:55 回复(0)
function duplicates(arr) {
    var arrs = []
    for(var i of arr){
        arrs.indexOf(i) === -1 && arr.indexOf(i) !== arr.lastIndexOf(i) && arrs.push(i)
    }
    return arrs
}


发表于 2021-03-17 19:28:11 回复(0)
function duplicates(arr) {
    let map = {} ,newarr = []
    for(let i = 0;i < arr.length; i++){
        if(!map[arr[i]]){
            map[arr[i]] = 1
            continue
        }
        map[arr[i]] += 1
    }
    for(num in map){
        if(map[num] > 1){
            newarr.push(num)
        }
    }
    return newarr
}

发表于 2021-03-12 21:56:38 回复(0)
function duplicates(arr) {
    let newarr= []
    for(let i = 0;i<arr.length;i++){
        for(let j = i+1;j<arr.length;j++){
            if(arr[i] == arr[j]){
                arr.splice(j,1)
                newarr.push(arr[i])
                break
            }
        }
    }
    return newarr
}

function duplicates(arr) {
    let newarr= []
    for(let i = 0;i<arr.length;i++){
        for(let j = i+1;j<arr.length;j++){
            if(arr[i] == arr[j]){
                arr.splice(j,1)
                newarr.push(arr[i])
                break
            }
        }
    }
    return newarr
}


发表于 2021-03-12 10:21:00 回复(0)
function duplicates(arr) {
     const obj = {};
     arr.forEach((item,index) => {
         if(!obj[item]) {
             obj[item] = 1
         }else{
              obj[item] ++;   
         }   
     })
      return Object.keys(obj).filter(item => obj[item] > 1)
}
1、创建一个空对象
2、遍历数组,如果对象中没有数组项,则对象的键为数组项,值为1
3、如果对象中包含数组项,则对应的值++
4、遍历对象,筛选值大于1的键
发表于 2021-03-01 23:43:41 回复(0)
ES6语法
function duplicates(arr) {
    var s = new Set()
    var a = new Set()
    for(var i in arr){
        var len = s.size
        s.add(arr[i])
        if(s.size == len){
            a.add(arr[i])
        }
    }
    return [...a]
}

发表于 2021-03-01 22:29:27 回复(0)
function duplicates(arr) {
    let repeat = [];
    let obj = {}
    arr.forEach(val => {
        obj[val] = obj[val] ? obj[val]+1 : 1
        if(obj[val] === 2){
            repeat.push(val)
        }
    })
    return repeat
}

编辑于 2021-03-01 17:16:33 回复(0)
function duplicates(arr) {
     let a = {}
     for(let i=0;i<arr.length;i++) {
         a[arr[i]] === void 0 ? a[arr[i]]=1 : a[arr[i]]++
     }
    let b = []
    for(let key in a) {
        if(a[key]>=2){
            b.push(key)
        }
    }
    return b
}
发表于 2021-02-23 21:05:22 回复(0)
function duplicates(arr) {
    let newarr = []
    for (let i = 0;i<arr.length;i++) {
        for (let j = i+1;j<arr.length;j++) {
            if (arr[i] === arr[j] && !newarr.includes(arr[i])) {
                newarr.push(arr[i])
            }
        }
    }
    return newarr
}
发表于 2021-02-22 17:19:40 回复(0)
function duplicates(arr) {
    var newArr = []
    // 遍历arr
    for (var i = 0; i < arr.length; i++){
        // newArr表示重复的个体列表, 如果当前元素已经出现,则跳过
        if(newArr.indexOf(arr[i]) == -1){
            // 截取除当前元素外的其余元素 与 当前元素 比较
            var arr1 = arr.slice(i+1)
            if(arr1.indexOf(arr[i]) != -1){
                newArr.push(arr[i])
            }
        }
    }
    return newArr
}
发表于 2021-02-12 22:29:22 回复(0)
function duplicates(arr) {
    let arr1 = [];
    let arr2 = new Set();
    for(let i of arr){
        if(arr1.indexOf(i)==-1){
            arr1.push(i);
        }else{
            arr2.add(i);
        }
    }
    return [...arr2];
}

发表于 2021-01-20 20:28:17 回复(0)
function duplicates(arr) {
    let count={},_arr=[];
    arr.forEach(function(item){
        item in count?count[item]+=1:count[item]=1;
        return count
    })
    for(let key in count){
        if(count[key]>1){
            _arr.push(key)
        }
    }
    return _arr
    
}
发表于 2021-01-18 17:03:43 回复(0)