【问题标题】:Relative Sort Array Javascript相对排序数组 Javascript
【发布时间】:2020-11-14 13:42:51
【问题描述】:

我正在解决 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
]

为什么会这样?

谢谢!!!

【问题讨论】:

  • 你的逻辑错了,通过 indexOf 函数遍历 arr1 检查值是否在 arr2 中
  • 您的 end 数组很大,因为在 arr2 的每次迭代中,您都会一遍又一遍地找到相同的缺失元素。
  • @AkashDathan 结果告诉我这是错误的。我不明白这是怎么回事。我认为他们在这里是同样的推动,如果不是在那里推动的话。为什么这不起作用?
  • @CarlosRoso 它如何再次迭代所有内容?
  • 首先 i = 0。然后遍历 arr1 中的所有项目,找到缺少的项目,并将它们添加到 end。然后,i = 1,然后你遍历arr1 中的所有项目,找到缺少的项目,并将它们添加到end。然后,i = 2,然后....

标签: javascript sorting


【解决方案1】:

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

使用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]));

【讨论】:

  • 这段代码确实有效,你能帮我理解一下吗?
  • @AndreTheTallGuy 当您使用带有回调的.sort 函数时,您需要一种方法来告诉“ab 之前”。你不能在这里使用这些值,你的标准是这些值应该去的位置。您可以通过构建一个映射来自arr2 的值与位置的对象来获得该标准,例如order = {2: 1, 1: 2, 4: 3, 3: 4, 9: 5, 6: 6}。然后使用这些索引来比较“啊,3 在 9 之前,因为 order[3] = 4order[9] = 5,这意味着 4-5 order 的数字,您假设它们通过为它们分配“无限”位置而进入尾部。
【解决方案2】:

arr2 的每次迭代中: 所有与当前数字不同的数字都被推送到end数组中

例如,

第一次迭代 - 比较数字 (2),您将得到:

arr: [2,2,2]

end: [3,1,3,4,6,7,9,19]

第二次迭代 - 比较数字 (1),您将得到:

arr: [2,2,2,1]

end: [3,1,3,4,6,7,9,19] + [2,3,3,2,4,6,7,9,2,19]

尝试调试您的代码以遵循流程

【讨论】:

  • 为什么结尾等于 [3,1,3,4,6,7,9,19]?
  • 在第一次迭代中,您将推送所有!=2 的项目在第二次迭代中,您将推送所有!=1 的项目...