繁体   English   中英

如何在没有嵌套循环的情况下将数组值相乘

[英]How to multiply array values without nested loops

问题:

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

例如:

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

  • 如果我们的输入是 [3, 2, 1],那么预期的 output 将是 [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))

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

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

但是,如果有零,则需要做更多的工作来检查有多少。 一个零很好,但大于 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))

根据@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)

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

  • 计算所有数组元素的乘积
  • 在 position [i] 处将乘积除以得到所需的 output
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))
input.reduce((t, v, i) =>
  [...t, [
    ...input.slice(0, i),
    ...input.slice(i + 1)
  ].reduce((t2, v2) => t2 * v2, 1)], []
);

编辑:对不起,语言错误...

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

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

如果您知道导入math库,您可以简单地使用以下命令在一行中计算产品: math.prod(items) ,然后除以您要忽略的值......就像这样:

math.prod(items) / items[index]

如果您现在想将其压缩成一行而不是将其包装到 for 循环块中,您可以简单地使用列表压缩,结果将是这样的:

result = [(math.prod(items) / x) for x in items]

请注意,这将导致浮点数。 如果您只想要整数,则需要先转换它们:

result = [int(math.prod(items) / x) for x in items]

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM