Javascript: Найти продукт смежных элементов массива и вернуть самый большой продукт - PullRequest
2 голосов
/ 19 октября 2019

Я работаю над совершенствованием своих навыков работы с 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 отношение к попытке вызоваMath.max и оператор распространения перед завершением цикла for и помещением значений в массив?

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Поскольку вы добавляете 2 к i, а затем смотрите 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);
1 голос
/ 19 октября 2019

i <= inputArray.length должно быть i < inputArray.length. Индексы массива идут от 0 до array.length-1. Когда i == inputArray.length, вы добавляете два значения undefined, что приводит к NaN.

...