首页 > 试题广场 >

查找重复元素

[编程题]查找重复元素
  • 热度指数:148097 时间限制: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) {
            arr.sort(); //排序
            var nArr = [];
            for (var i = 0, j = 1; j < arr.length; j++) { //前后两个指针
                if (arr[i] != arr[j]) {
                    if (j - i > 1) {
                        nArr.push(arr[i]);
                    }
                    i = j; //不等时替换指针
                }
            }
            return nArr;
        }
发表于 2016-11-11 11:40:18 回复(1)
function duplicates(arr) {
 var result = [];
    arr.forEach(function(elem){
       if(arr.indexOf(elem) !=arr.lastIndexOf(elem) && result.indexOf(elem) == -1){
           result.push(elem);
       } 
    });
    return result;
}
#春招# #网易# #网易雷火2020春招# #网易雷火实习# 

网易游戏雷火事业群春季校园招聘内推开始啦~内推可以直通至笔试/测试环节哦~~

热招岗位:游戏研发、游戏策划、游戏美术、技术美术、游戏测试、游戏人工智能、游戏交互等等。

内推链接:https://new.hi.163.com/leihuoneitui/?#/?introduce_id=9kn84hiaxgvlfsei&&id_token=77e82ec128a9de760afb7829873e8019&&project_id=1000000350&mbshare=cplink&spreadtimes=1



内推时间:即日起至2020年3月27日

内推对象:1. 2021年及以后毕业(招实习生)

         2. 2020年毕业(校招补招)

编辑于 2020-02-24 11:16:45 回复(52)
function duplicates(arr) {
    let res = [];
    arr.forEach(item => {
        if(arr.indexOf(item) !== arr.lastIndexOf(item) && res.indexOf(item) === -1) {
            res.push(item);
        }
    });
    return res;
}

发表于 2022-03-26 17:49:11 回复(0)
function duplicates(arr) {
    var newArr = new Set();
    arr.forEach((item, index) => {
        if (arr.indexOf(item) != index && item !== '') {
            newArr.add(item);
        }
    });
    return Array.from(newArr);
}

发表于 2022-01-06 16:20:11 回复(1)
function duplicates(arr) {
    arr.sort();
    let rs=[]
    arr.forEach((va,index) =>{
       if (arr[index]==arr[index+1]){
           rs.push(va)
       }
    })
  //返回出去 去重复就好了
    return [...new Set(rs)]
}
发表于 2021-12-01 14:22:37 回复(0)
function duplicates(arr) {
  let arr2 = [];
  for (let i = arr.length - 1; i >= 0; i--) {
    let element = arr[i];
    if ([...arr.slice(0, i)].includes(element) ) {
      console.log(element);
      arr2.push(element);
    }
  }
  return [...new Set(arr2)];
}



发表于 2021-11-02 21:30:53 回复(1)
function duplicates(arr) {
    let b = Array.from(new Set(arr))
    return b.filter(item => (arr.filter(num => num === item).length > 1))
}

这也可以啊
发表于 2021-08-01 22:59:42 回复(0)

hash表

function duplicates(arr) {
    const target = [];
    const map = new Map();
    arr.forEach(v => {
        if(map.has(v) && !target.includes(v)) {
            target.push(v);
        } else {
            map.set(v, v);
        }
    });
    return target;
}
发表于 2021-07-29 17:10:47 回复(0)
function duplicates(arr) {
    const newArr = []
    const newArr2 = []
    for(let i=0, len = arr.length; i<len; i++) {
        if(newArr.indexOf(arr[i]) == -1) {
            newArr.push(arr[i])
        } else {
            if(newArr2.indexOf(arr[i]) == -1) {
                newArr2.push(arr[i])
            }
        }
    }
    return newArr2
}
发表于 2021-07-06 21:19:50 回复(0)
function duplicates(arr) {
    const ret = new Set(), aset = new Set()
    for(let x of arr){
        if(aset.has(x))
            ret.add(x)
        aset.add(x)
    }
    return Array.from(ret.values())
}

发表于 2021-05-09 09:18:49 回复(0)
//通过对象去重在转换成数组 
function duplicates(arr) {
    let obj = {}
    let arr1 = []
    for(let i = 0 ; i < arr.length ; i++){
        for(let j = i+1 ; j < arr.length ; j++){
            if(arr[i]==arr[j]){
                obj[arr[i]] = arr[i];
            }
        }    
    }
    for(key in obj){
        arr1.push(obj[key])
    }
    return arr1
}

发表于 2020-11-21 20:13:32 回复(0)

function duplicates(arr) {
    var res = [];
    arr.forEach( (item, idx) => {
        // 从arr后一个开始找是否还有重复,以及在res中是否记录
        if(arr.includes(item, idx+1) && !res.includes(item)) {
            res.push(item);
        }
    });
    // 先获取元素再排序
    return res.sort();
}


发表于 2020-05-01 17:26:59 回复(0)
function duplicates(arr) {
    const norepeat = new Set(arr)
    return Array.from(norepeat).filter(item => {
        return  arr.indexOf(item) !== arr.lastIndexOf(item)
    })
}

发表于 2020-04-07 16:30:43 回复(0)
function duplicates(arr) {
    //思路:第一个for先把有重复的元素放入temp,第二个for再对temp去重,最后对temp排序
    let temp = []
    for(let i=0;i<arr.length;++i){
        for(let j=i+1;j<arr.length;++j){
            if(arr[i]===arr[j]){
                temp.push(arr[i])
            }
        }
    }
    for(let a=0;a<temp.length;++a){
        for(let b=a+1;b<temp.length;++b){
            if(temp[a]===temp[b]){
                temp.splice(b,1)
                b=b-1
            }
        }
    }
    temp=temp.sort()
    return temp 
}
let arr=[1, 2, 4, 4, 3, 3, 1, 5, 3]
duplicates(arr) //[1,3,4]

编辑于 2020-04-07 13:57:04 回复(0)
function duplicates(arr) {
    let res_arr = [];
    let arr_1 = JSON.parse(JSON.stringify(arr));
    while(arr_1.length){
        let [item] = arr_1.splice(0,1);
        console.log(item);
        if(arr_1.includes(item) && !res_arr.includes(item)) res_arr.push(item);
    }
    return res_arr;
}

发表于 2020-04-01 13:17:28 回复(0)
function duplicates(arr) {
    return arr.filter((e,i) =>
        arr.lastIndexOf(e) != i && i == arr.indexOf(e)
    ).sort();
}

function duplicates(arr) {
    arr1 = arr.slice(0);
    a = Math.max.apply(Math,arr1);
    var arr2 = [];
    for (let i = 0; i < a; i++){
        count = 0;
        for (let j = 0; j < arr1.length; j++){
            if (i == arr1[j]){
                count++;
            }
        }
        if (count >= 2){
            arr2.push(i);
        }
    }
    return arr2;
}


编辑于 2020-03-24 15:16:42 回复(0)
function duplicates(arr) {
 var s = new Set();
 var s1 = new Set();
    arr.forEach(v=>{
        if(s.has(v)) {
            s1.add(v);
        }
        s.add(v);
    });
    return Array.from(s1);
}
发表于 2020-03-07 20:22:40 回复(0)
function duplicates(arr) { var newArr=[];//建立一个空数组存放重复值 for(var i=0;i
发表于 2019-12-21 22:23:38 回复(0)
本题,我选择了两种做法,一种是比较简单的,一种是稍微复杂了。简单的就是用indexOf与lastIndexOf进行匹配,复杂点的方法是利用数组保存筛出重复项。好处是,可以得到重复项数组以及去除重复部分的数组。
代码如下:
/*************forEach************/
function duplicates(arr){
    var dupnum=[];
    arr.forEach(function(el){
        if(arr.indexOf(el)!=arr.lastIndexOf(el) && dupnum.indexOf(el)==-1){
            dupnum.push(el);
        }
    });
    return dupnum;
}

/**********复杂想法************/
function duplicates(arr){
    var tmp=[];//筛去重复多余项
    var num=[];//存放重复项
    var tmpArr = arr.map(function(el){
            if(tmp.indexOf(el)==-1){
                tmp.push(el);//如果没出现过就保存到这个数组,初始数组去除重复的部分
                //console.log(el);
            }else{
                if(tmp.indexOf(el)!== -1 && tmp.length!=0){//如果该元素再次出现,则该元素属于重复项
                    if(num.indexOf(el)==-1) {//把重复的那个数值放到num中并返回该数值,这样就还能保证不会重复返回相同的数值
                        num.push(el);
                        return el;
                    }
                }
            }
        });
    return tmpArr.filter(function(el,index,a){
            if(el !=undefined) return el;
    });
    }

发表于 2019-12-18 21:40:40 回复(0)
首先定义一个对象obj,然后遍历数组,对于数组的每一个值都作为obj的key, 而对应的value则是出现的次数。最后通过filter函数过滤出出现次数大于1的key值。

function duplicates(arr) {
    if(!arr || arr.length < 1) {
        return [];
    }
    const obj = {};
    arr.forEach((item) => {
        if(obj[item]) {
             obj[item] ++;
        } else {
            obj[item] = 1;
        } 
    });
    return Object.keys(obj).filter((key) => obj[key] > 1)
}

发表于 2019-12-02 15:29:50 回复(0)