首页 > 解决方案 > 相对排序数组 Javascript

问题描述

我正在解决 LeetCode 上的一个问题并且遇到了一些麻烦

https://leetcode.com/problems/relative-sort-array/

说明:给定两个数组 arr1 和 arr2,arr2 的元素是不同的,并且 arr2 中的所有元素也在 arr1 中。

对 arr1 的元素进行排序,使 arr1 中的项目的相对顺序与 arr2 中的相同。未出现在 arr2 中的元素应按升序放置在 arr1 的末尾。

示例 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]

我的尝试:

var relativeSortArray = function(arr1, arr2) {
    let arr =[]
    let end =[]
    for (i=0; i<arr2.length; i++){
        for (j=0; j<arr1.length; j++){
            if(arr2[i] == arr1[j]){
                arr.push(arr1[j])
            }else{
                end.push(arr1[j])
            }
        }
    }
    end.sort((a,b) => a-b)
    console.log(end)
    return arr
};

If 条件有效,但 else 条件无效,我不知道为什么。

我认为 console.log(end) 应该给我两个不在 arr2 中的数字,而是给我:

[
  1, 1, 1,  1,  1,  2,  2,  2,  2, 2, 2, 2,
  2, 2, 2,  2,  2,  2,  2,  2,  3, 3, 3, 3,
  3, 3, 3,  3,  3,  3,  4,  4,  4, 4, 4, 6,
  6, 6, 6,  6,  7,  7,  7,  7,  7, 7, 9, 9,
  9, 9, 9, 19, 19, 19, 19, 19, 19
]

为什么会这样?

谢谢!!!

标签: javascriptsorting

解决方案


您可以将一个对象作为一个值的位置,并将一个较大的值Number.MAX_VALUE作为默认值。如果增量为零,按值排序。

使用 delta 是一个标准Array#sort。这将返回一个小于零、零或大于零的值,具体取决于值。sort 方法接收此值并保留或交换这些值。

const
    relativeSort = (array, given) => {
        const order = Object.fromEntries(given.map((v, i) => [v, i + 1]));
        return array.sort((a, b) =>
            (order[a] || Number.MAX_VALUE) - (order[b] || Number.MAX_VALUE) ||
            a - b
        );
    };

console.log(...relativeSort([2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19], [2, 1, 4, 3, 9, 6]));


推荐阅读