数组的相对排序

128 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

题目描述

给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 来源:力扣(LeetCode)

  • 示例1
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
  • 示例
输入: arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出: [22,28,8,6,17,44]

提示:

  • 1 <= arr1.length, arr2.length <= 1000
  • 0 <= arr1[i], arr2[i] <= 1000
  • arr2 中的元素 arr2[i]  各不相同 
  • arr2 中的每个元素 arr2[i] 都出现在 arr1 中

思路分析

剧题意可知,我们需要从arr1中找出某人些元素,这些元素全部都出现在arr2中,然后按arr2的顺序排列起来,剩下一些没有在arr2出现的元素就按照升序放在arr1的末尾。arr2中的每一个元素都一定会出现在arr1中。 简单粗暴的实现方法只需要三步,按arr2中的顺序取出arr1在arr2中的所有元元素,循环arr2然后在每次循环中再循环arr1,这样就能按顺序取出了,接着过滤出不在arr2中的arr1中的元素,循环arr1,用javaScript的includes方法判断是否在arr2中,若不是则返回出来,这样就能过滤出来了,紧接着将过滤出来的数组进行升序排序,到了这一步就产生了两个新的数组,一个按arr2排序的数组,一个是不在arr2中并按升序排序的数组,将两个数组合并就是我们想要得到的数组了。

let arr1 = [2,3,1,3,2,4,19,6,7,9,2], arr2 = [2,1,4,3,9,6]
function solution(long, short) {
    let sameArr = [], newArr = []

    short.forEach( item => {
        long.forEach( subItem => {
            if(item === subItem) {
                sameArr.push(subItem);
            }
        })
    })
    long.forEach( item => {
        if(!(short.includes(item))) {
            newArr.push(item)
        }
    })
    newArr.sort((a, b) => {return a - b});
    console.log(sameArr)
    console.log(newArr)
    return [...sameArr, ...newArr]

}
solution(arr1, arr2)

总结