【问题标题】:How to multiply array values without nested loops如何在没有嵌套循环的情况下将数组值相乘
【发布时间】:2022-01-23 22:06:25
【问题描述】:

问题:

给定一个整数数组,返回一个新数组,使得新数组索引 i 处的每个元素都是原始数组中除 i 处之外的所有数字的乘积。

例如:

  • 如果我们的输入是 [1, 2, 3, 4, 5],那么预期的输出将是 [120, 60, 40, 30, 24]。

  • 如果我们的输入是 [3, 2, 1],那么预期的输出将是 [2, 3, 6]。

解决方案 1(使用嵌套循环):我可以通过如下嵌套循环来解决这个问题:

const input = [1, 2, 3, 4, 5];

function output(items) {
const finalArray = [];
 for (let i = 0; i < items.length; i++) {
    let multipliedNum = 1;
    
    items.forEach((item, indx) => {
      if (i !== indx) {
        multipliedNum = multipliedNum * item;
      }
    });
         finalArray.push(multipliedNum)

    }
  return finalArray;

}

console.log(output(input))

我正在尝试找出另一个在输出函数中没有嵌套循环的解决方案?非常感谢任何帮助或建议。

【问题讨论】:

  • 数组中值的范围是多少?值可以为零吗?
  • 数学时间:“所有元素的乘积,除了i 处的元素”与“所有元素的乘积,除以i 处的元素”相同。因此,您只需要两次迭代而无需嵌套:第一次计算乘积,然后第二次生成所有请求的值。
  • @GenericUser 现在假设数组中没有零。

标签: javascript arrays


【解决方案1】:

我知道这已经得到了回答,但我想我有一个更好的答案。

如果你用不同的方法来处理这个问题,你会发现把索引值排除在外的产品,也是除以索引值的产品。

如果你知道使用reduce函数,你可以简单地用一行计算乘积:

items.reduce((a, b) => a * b)

然后除以您要忽略的值...像这样:

items.reduce((a, b) => a * b) / items[index]

如果您现在想将其压缩成一行而不是将其包装到 for 循环块中,您可以简单地复制数组并使用 map 函数,结果可能如下所示:

result = [...items].map((v, i) => items.reduce((a, b) => a * b) / v)

我希望这可以帮助您减少代码

【讨论】:

    【解决方案2】:

    根据@Mike 在评论中所说的,这就是答案。

    const input = [1, 2, 3, 4, 5];
    const mulValues = input.reduce((acc, next) => acc * next);
    const output = input.map(i => mulValues/i)
    console.log(output)
    

    【讨论】:

      【解决方案3】:

      如果没有零值,您可以遍历所有值一次以获取产品。然后只返回每个产品除以每个条目的数组。

      但是,如果有零,则需要做更多的工作来检查有多少。一个零很好,但大于 1 意味着每个条目的值为零。

      const input = [1, 2, 3, 4, 5];
      const input2 = [1, 2, 3, 4, 0];
      const input3 = [1, 2, 3, 0, 0];
      
      function output(items) {
        let zeroCount = 0;
        let totalProduct = 1;
        for (let i = 0; i < items.length; i++) {
          if (items[i] === 0) {
            if (++zeroCount > 1) break;
            continue;
          }
          totalProduct *= items[i];
        }
      
        if (zeroCount > 1) {
          // more than 1 zero -> all values are 0
          return new Array(items.length).fill(0);
        } else if (zeroCount === 1) {
          // only 1 zero -> only the value that is zero will be the totalProduct
          return items.map(item => item === 0 ? totalProduct : 0);
        }
        // no zero in array -> divide the totalProduct by each item
        return items.map(item => totalProduct / item);
      }
      
      console.log(output(input))
      console.log(output(input2))
      console.log(output(input3))

      【讨论】:

        【解决方案4】:

        你可以这样做(假设数组不包含零):

        • 计算所有数组元素的乘积
        • 在位置 [i] 处按元素划分产品以获得所需的输出
        const input = [1, 2, 3, 4, 5];
        
        function output(items) {
        const finalArray = [];
        const multipliedNum=1;
         for (let i = 0; i < items.length; i++) {
             multipliedNum *= item[i];
            }
         for (let i = 0; i < items.length; i++) {
              finalArray.push(multipliedNum/item[i]);
           }
          return finalArray;
        }
        
        console.log(output(input))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多