Javascript:查找相邻数组元素的乘积并返回最大乘积

时间:2019-10-18 21:18:35

标签: javascript arrays math ecmascript-6 iteration

我正在努力提高我的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和散布运算符有关,并且值已推入数组吗?

2 个答案:

答案 0 :(得分:1)

i <= inputArray.length应该是i < inputArray.length。数组索引从0array.length-1。在i == inputArray.length时,您要添加两个undefined值,它们会产生NaN

答案 1 :(得分:1)

由于您要向i加2,然后查看ii + 1,因此您实际上只想在0inputArray.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

您可能还希望检查不均匀的数组,以免得到nundefined的乘积。您可以通过在找到它们的乘积之前检查值,并忽略任何包含对的undefined来实现。

为获得更多乐趣,下面是该函数的递归版本:

const adjacentElementsProduct = ([a, b, ...rest], agg = []) =>  rest.length 
? adjacentElementsProduct(rest, [...agg, a * b]) 
: Math.max(...agg);
相关问题