面试复习题-数组去重

114 阅读1分钟

✊不积跬步,无以至千里;不积小流,无以成江海

思路

方法一:使用 Set

return Array.from(new Set(a))

方法二:计数排序

思路:

  1. 定义一个普通对象map
  2. 遍历这个map
  3. 定义number为a的第i个
  4. 如果number在map里面,则用continue继续遍历
  5. 如果不在map里面,则定义number = true
  6. 如果是稀疏数组(即存在null或undefined),则直接continue跳过
  7. 返回map的所有key

相当于遍历数组,把所有的key放到map上面;然后遍历map把map上面的key再放到数组上

但这种方法有一个问题,就是由于输出都是字符串【map的key只能为symbol或者string】

方法三:使用map

  1. 定义一个map为new map
  2. 由于这个map只能用get/set取值,所以不能再使用map[nubmer],要用set使number为true

这样就能够区分任何的数组;因为map的key可以为任何类型

实现

方法二:

var uniq = function(a){
    var map = {}
    for(let i=0;i<a.length;i++){
        let number = a[i] 
        if(number === undefined){continue}
        if(number in map){continue}

        map[nubmer] = true

    }
    return object.keys(map)
    
    //如果不能用keys
    //const result = []
    //for (let key in map){
    //    result.push(key) 
    //}
    //return result    
}

方法三(更改处用//标识):

var uniq = function(a){
    //var map = new Map()
    for(let i=0;i<a.length;i++){
        let number = a[i] 
        if(number === undefined){continue}
        // if(map.has(number)){continue}

        //map.set(number, true)

    }   
    //return [...map.keys()]  
}