拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在没有嵌套回圈的情况下乘以阵列值

如何在没有嵌套回圈的情况下乘以阵列值

白鹭 - 2022-01-23 2101 0 0

问题:

给定一个整数阵列,回传一个新阵列,使得新阵列索引 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))

我正在尝试找出在输出函式中没有嵌套回圈的另一种解决方案?任何帮助或建议真的很感激。

uj5u.com热心网友回复:

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

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

uj5u.com热心网友回复:

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

uj5u.com热心网友回复:

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

  • 计算所有阵列元素的乘积
  • 将乘积除以位置 [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))

uj5u.com热心网友回复:

input.reduce((t, v, i) =>
  [...t, [
    ...input.slice(0, i),
    ...input.slice(i   1)
  ].reduce((t2, v2) => t2 * v2, 1)], []
);

uj5u.com热心网友回复:

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

如果您通过不同的方法处理这个问题,您将看到产品将指数处的价值排除在外,也是产品除以指数处的价值。

如果您知道使用 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)

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *