题解 | #数组去重#

数组去重

https://www.nowcoder.com/practice/7a26729a75ca4e5db49ea059b01305c9

数组去重的多种方法(参考了网上的解法,具体可以看这位大佬的JavaScript数组去重(12种方法,史上最全) - SegmentFault 思否)

一、利用自身的特性“不允许相同”来去重,对象的属性不能重复,ES6的Set或者 Map进行去重(Set这个方法有点短,面试应该不允许这样写吧?😥

   1. 用Set本身的"不容二虎"的特性先获取唯一的元素,接着用上ES6的新属性 “...” 扩展运算符创建新数组(或者用另一个方法 Array.from将某个类似数组或可迭代对象转为数组)。

    return [...new Set(array)]          或者 return Array.from(new Set(array))

   2. Map和Set一样具有元素唯一性,对于非对象类型,基础值基本能去重,可以用下文的splice原地去重(去重之后要记得更新map中的key-value键值对),也可以用创建新数组装不同元素返回结果
let map = new Map();
const res = [];  // 数组用于返回结果
for (let i = 0; i < array.length; i++) {
    if(!map.has(array[i])) {  // 如果map中不存在相同值,那么存入数组,否则什么也不干
        res.push(array[i])
        map.set(array[i],1)
    }
  } 
return res;
   3.对象属性不能重复,根据大佬的说法,这种方法不可靠,但是面试可以说思路?🤣 还是别说了,避免到时候中招给自己挖坑,一问到底,问到裤衩都不剩

二、双循环 +  splice(或者双循环+新数组,新数组遇到新数就存,否则相同的数不存入), 遇到相同的元素则 splice删除   ,除了用splice还可以考虑其他能删除元素的方法(splice本身改变数组,slice不改变,slice额外开辟新空间😀给自己复习知识点,所以去重还是选择splice),核心是 双重循环找到相同元素并删除 

//外层循环对每个数进行重复判断
for(let i=0; i<array.length; i++){
    //内层循环对外层循环的下标 和内层循环下标的数进行相等判断
    for(let j=i+1; j<array.length; j++){
      //内层循环的数等于外层循环的数,那么删除外层循环的数
        if(array[i]==array[j]){     
            array.splice(j,1);
            j--;//注意删除之后,当前数就没了,要改变下标
        }
  }
}
return array

三、 filter去重 核心是 对每个元素进行过滤, 只取每个数第一次出现的位置

return arr.filter(function(item, index, array) {
    //filter总是获取每个数 indexOf() 后续还有其他相同的数都不管,这样就能达到不重复的目的
    return array.indexOf(item, 0) === index;
 });

四、排序去重,这个排序方法很多,主要是排序之后,相同的数都会在相邻的位置,比较好删除


五、合理利用  IndexOf(xxx)  和 lastIndexOf(xxx)

对每个数进行循环判断,只要  indexOf(xxx)  !== lastIndexOf(xxx)的数(即同一个数第一次和最后一次出现的位置不等 说明出现两个重复的数只留下一个,类似于后羿射日),那么就不断删除(只留下一个,类似于后羿射日) , 这种方法目前我没试过,应该可行?



其他方法,因为猪脑过载,就暂时不想了,想深入探讨的 可以去这里看看 JavaScript数组去重(12种方法,史上最全) - SegmentFault 思否

#做题##面试题##笔试##牛客题霸#
全部评论

相关推荐

我就是0offer糕手:北大不乱杀
点赞 评论 收藏
分享
04-06 16:59
已编辑
河南工业大学 Java
牛牛牛的牛子:最好扔了,实在没有选择的选择
点赞 评论 收藏
分享
评论
5
2
分享

创作者周榜

更多
牛客网
牛客企业服务