我正在努力提高我的JS技能,并解决CodeSignal上的一些问题。我正在解决以下问题:
给出一个整数数组,找到具有最大乘积的相邻元素对并返回该乘积。
例如,给定数组[2,3,5,10,2,4]
,我想执行以下操作:
2 * 3 = 6
5 * 10 = 50
2 * 4 = 8
然后我想退回最大的产品,在这种情况下为50。
我的方法是使用for循环进行迭代,将i * i + 1乘以,将乘积推入新的数组,然后将for循环加2,以便可以对数组中的下两个数字进行乘数运算。当我完成推入新数组后,我想使用Math.max
并在数字数组上调用它以返回最大乘积。
Math.max
在数组上不起作用,因此我将使用ES6扩展运算符并执行以下操作:
Math.max(...products);
这是我到目前为止无法正常工作的内容:
function adjacentElementsProduct(inputArray) {
var products = [];
for(var i = 0; i <= inputArray.length; i = i + 2) {
products.push(inputArray[i] * inputArray[i + 1]);
};
// Correctly logs elements of products array
console.log(products);
// NaN error
console.log(Math.max(...products));
return Math.max(...products);
}
此NaN错误是否与在for循环结束之前尝试调用Math.max和散布运算符有关,并且值已推入数组吗?
答案 0 :(得分:1)
i <= inputArray.length
应该是i < inputArray.length
。数组索引从0
到array.length-1
。在i == inputArray.length
时,您要添加两个undefined
值,它们会产生NaN
。
答案 1 :(得分:1)
由于您要向i
加2,然后查看i
和i + 1
,因此您实际上只想在0
和inputArray.length - 2
之间循环
给出示例代码,您可以通过更改for
循环来解决此问题:
for(var i = 0; i <= inputArray.length - 2; i = i + 2) {
products.push(inputArray[i] * inputArray[i + 1]);
};
让我们手动进行分解,以便您可以看到它的作用:
i = 0
,我们的价值观是[2, 3]
,产品是6
i = 2
,我们的价值观是[5, 10]
,谁的产品是50
i = 4
,我们的价值观是[2, 4]
,其产品是8
。这时我们的循环结束了,因为inputArray.length - 2
也等于4
,即6 - 2 === 4
。
您可能还希望检查不均匀的数组,以免得到n
和undefined
的乘积。您可以通过在找到它们的乘积之前检查值,并忽略任何包含对的undefined
来实现。
为获得更多乐趣,下面是该函数的递归版本:
const adjacentElementsProduct = ([a, b, ...rest], agg = []) => rest.length
? adjacentElementsProduct(rest, [...agg, a * b])
: Math.max(...agg);