奇怪的 Leetcode 错误:Array.fill() 与新的 Array.from()

Weird Leetcode Bug: Array.fill() vs new Array.from()

我正在研究 Leetcode Problem 1770 和 运行 一些奇怪的行为,希望有人能帮助我理解。

这是一个动态规划问题,需要您实例化一个长度为 m 的二维数组。很直接。

奇怪的是,我生成二维数组的语法导致问题失败,但替代语法通过了所有测试。据我所知,这两行输出相同的结果。

我的语法:

//  const m = 3

    let memo = new Array(m).fill(new Array(m).fill(-Infinity))
    console.log({memo})

//  stdout: {
//    memo: [
//      [ -Infinity, -Infinity, -Infinity ],
//      [ -Infinity, -Infinity, -Infinity ],
//      [ -Infinity, -Infinity, -Infinity ]
//    ]
//  }

替代语法:

//  const m = 3

    let memo = Array.from(Array(m), () => Array(m).fill(-Infinity))
    console.log({memo})

//  stdout: {
//    memo: [
//      [ -Infinity, -Infinity, -Infinity ],
//      [ -Infinity, -Infinity, -Infinity ],
//      [ -Infinity, -Infinity, -Infinity ]
//    ]
//  }

在我看来,两者的输出完全相同。然而,一个人通过了所有测试,而没有通过。给出了什么?

在第一种情况下,您使用相同的 Array 实例填充数组。在第二种情况下,每一行都是新的 Array 因为您提供了一个工厂函数。

const m = 3;

let memo = new Array(m).fill(new Array(m).fill(-Infinity));

console.log(memo[0] === memo[1]); // true

const m = 3

let memo = Array.from(Array(m), () => Array(m).fill(-Infinity));

console.log(memo[0] === memo[1]); // false

附带说明一下,您不需要传递 Array 作为 Array.from 的第一个参数,一个 ArrayLike 就足够了:

const m = 3

let memo = Array.from({ length: m }, () => Array(m).fill(-Infinity));

console.log(memo);