【问题标题】:Weird Leetcode Bug: Array.fill() vs new Array.from() [duplicate]奇怪的 Leetcode 错误:Array.fill() 与 new Array.from() [重复]
【发布时间】:2022-01-07 23:27:53
【问题描述】:

我在处理 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 ]
//    ]
//  }

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

【问题讨论】:

    标签: javascript algorithm multidimensional-array data-structures dynamic-programming


    【解决方案1】:

    在第一种情况下,您将使用相同的 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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2017-02-11
      相关资源
      最近更新 更多