zoukankan      html  css  js  c++  java
  • JS Array:合并两个有序数组并去重

    前言

    这个问题对于 Array 练习是一个很好的例子,并且也是面试中经常遇到的。

    解题方法有多个,下面会逐个说下。

    一、遍历

    用遍历的方法实现应该是最先想到的方法。这个就需要对需要合并的数组合并再重新排序。

    1、遍历两个数组

    2、每一项:判断合并后的数组中是否有当前项(去重)

    /**
     * 对其中一个遍历去重
     * @param {Array} arr1 
     * @param {Array} arr2 
     * @returns 合并后的有序去重数组
     */
    function unionArray(arr1,arr2) {
      arr2.map(item=>{
        !arr1.includes(item) && arr1.push(item)
      })
    
      return arr1.sort()
    }

    上面的方法直接是用传入的 arr1 进行操作的,在同时打印了结果和 arr1 ,发现 arr1  被改变了。

    就对上面的进行了改动,这样对原先的两个数组就没有影响了。

    /**
     * 对其中一个遍历去重
     * @param {Array} arr1 
     * @param {Array} arr2 
     * @returns 合并后的有序去重数组
     */
    function unionArray(arr1,arr2) {
      const arrT = []
      arr1.map(item=>{
        !arrT.includes(item) && arrT.push(item)
      })
      arr2.map(item=>{
        !arrT.includes(item) && arrT.push(item)
      })
    
      return arrT.sort()
    }

    二、reduce

    reduce 和上面的思路是一样的,主要也是用遍历,但是看起来相对简单。

    /**
     * 对其中一个遍历去重
     * @param {Array} arr1 
     * @param {Array} arr2 
     * @returns 合并后的有序去重数组
     */
    function unionArray2(arr1,arr2) {
      // let arrT = arr1.reduce((pre,next)=>{
      //   pre.includes(next) || pre.push(next)
      //   return pre
      // },[])
      let arrT = JSON.parse(JSON.stringify(arr1))
    
      arrT = arr2.reduce((pre,next)=>{
        pre.includes(next) || pre.push(next)
        return pre
      },arrT)
    
      return arrT.sort()
    }

    对于第一个数组的处理,可以用 reduce 遍历,也可以直接用 JSON 序列化一下。

    三、Set

    用 Set 的原因是:Set 会自动对添加的项去重。这样就不用手动判断去重。

    具体实现:

    /**
     * 使用 Set 的去重实现
     *  主要 Set 的用法,需要使用 new 并且只能接收一个数组
     * @param {Array} arr1 
     * @param {Arra1} arr2 
     * @returns 合并后的有序去重数组
     */
    function unionArray(arr1,arr2) {
      const newSet = new Set(arr1)
      arr2.map(item=>{
        newSet.add(item)
      })
      return [...newSet].sort()
    }
  • 相关阅读:
    莫比乌斯反演
    CDQ 分治
    二分图的最大匹配、完美匹配和匈牙利算法
    网络流简介
    BSGS && EXBSGS
    fhq-treap
    炸鱼w咕咕咕
    路由器配置——静态路由
    路由器配置——静态路由-回环地址测试
    路由器配置——单臂路由实现VLAN间通信
  • 原文地址:https://www.cnblogs.com/zhurong/p/14647994.html
Copyright © 2011-2022 走看看