![](/img/trans.png)
[英]How to map array of objects, mapping their keys without nested loops?
[英]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)
你可以做这样的事情(假设数组不包含零):
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.