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