美文网首页
合并数组并排序去重

合并数组并排序去重

作者: 泪滴在琴上 | 来源:发表于2022-04-08 11:00 被阅读0次

题意就是, 我有两个数组,把他们两个合并。然后并去重,去重的逻辑是哪儿边的重复次数更多,我就留下哪儿边的。
比如下面的数组中,一边有两个数字5,另一半有三个数字5 。则我需要留下三个数字5,去掉两个数字5。 循环往复,最后得到的结果在进行排序。

数组一: [1, 100, 0, 5, 1, 5]

数组二: [2, 5, 5, 5, 1, 3]

最终的结果: [0, 1, 1, 2, 3, 5, 5, 5, 100]

  // 判断出现次数最多的次数
    function maxNum(item, arr) {
      let num = 0;
      arr.forEach(val => {
        item === val && num++
      })

      return num
    }

    function fn(arr1, arr2) {
      // 使用Map数据类型来记录次数
      let obj = new Map();

      // 合并数组并找出最多的次数, 并以键值对存放到Map数据类型
      [...arr1, ...arr2].forEach(item => {
        let hasNum = obj.get(item)
        let num = 1
        if (hasNum) {
          num = hasNum + 1
        }
        obj.set(item, num)
      })

      // 存放合并并去重之后的数组
      let arr = []
      // 遍历Map数据类型 然后把次数最多的直接push到新数组
      for (const key of obj.keys()) {
        if (obj.get(key) > 1) {
          for (let index = 0; index < Math.max(maxNum(key, arr1), maxNum(key, arr2)); index++) {
            arr.push(key)
          }
        } else {
          arr.push(key)
        }
      }

    // 最后进行排序
      return arr.sort((a, b) => a - b)
    }

这个题的思路其实就是,我先把两个数组合并起来
并以键值对的方式存放到Map数据类型, 键就是数据,而值就是这个数据出现的次数
生成一个新数组,用来存放合并之后的数组
遍历这个Map数据类型, 如果这个数据出现的次数大于一,那么就去寻找两个数组中谁出现的次数更多,把出现次数更多的这个数据,循环push到新数组中。 如果出现次数等于一,那就直接push到新数组中即可。
最后再把数组进行排序,然后返回新数组就可。

作者:Ali2333
链接:https://juejin.cn/post/7079681931662589960
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

网友评论

      本文标题:合并数组并排序去重

      本文链接:https://www.haomeiwen.com/subject/llagjrtx.html