-1

我试图了解以下解决方案,以在任何给定数组中查找最大的相邻产品。

例子:

 For inputArray = [3, 6, -2, -5, 7, 3], the output should be
 adjacentElementsProduct(inputArray) = 21.

 7 and 3 produce the largest product.

JS中可能的解决方案:

function adjacentElementsProduct(arr) {
  return Math.max(...arr.slice(1).map((x,i)=>[x*arr[i]]))
  }

我很难理解两件事:

  1. 这三个点到底做了什么,它是如何传递到函数中的?有没有办法以更容易理解的方式写这个?我知道这是 ES6 中的“扩展语法”功能,但仍然不完全理解。

  2. 为什么我们插入“1”作为切片的参数?我的第一个想法是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻的产品是最大的。

我将不胜感激任何建议、链接和解释。

谢谢。

干杯!

4

3 回答 3

1

1. 三个点到底是做什么的,它是如何传递给函数的?有没有办法以更容易理解的方式写这个?我知道这是 ES6 中的某种“传播”功能,但仍然不完全理解。

需要一个数字列表作为Math#max参数,并且 map 生成一个数组。扩展语法用于将要扩展的数组转换为参数列表。

const arr = [1, 2, 3];

console.log('max on array', Math.max(arr));

console.log('max on list of parameters', Math.max(...arr));

在这种情况下,您可以使用Function#apply将数组转换为参数列表。但是,我发现它的可读性较差。

const arr = [1, 2, 3];

console.log(Math.max.apply(Math, arr));

2. 为什么要插入“1”作为切片的参数?我的第一个想法是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻的产品是最大的。

让我们分解 2 个数组的迭代顺序。

[3, 6, -2, -5, 7, 3] // inputArray
[6, -2, -5, 7, 3] // inputArray.slice(1)

现在在每次迭代inputArray.slice(1)

x: 6, i = 0, arr[0] = 3
x: -2, i = 1, arr[1] = 6
x: -5, i = 2, arr[2] = -2

由于inputArray.slice(1)数组从 的第二个元素开始inputArray,索引 ( i) 指向 的第一个元素inputArray。结果是 2 个相邻数字的乘积数组。

于 2017-07-04T07:02:21.383 回答
1
var biggestProduct =  inputArray[0] *  inputArray[1];

for (i=0;  i<inputArray.length-1 ; ++i) 
{
  console.log(biggestProduct)
  if   ((inputArray[i] * inputArray[i+1] ) > biggestProduct) 
  { 
    biggestProduct = inputArray[i]  *  inputArray[i+1] 
  }
}
return biggestProduct;

注意:我已经声明了一个由 2 个带有索引号的输入数组组成的变量,然后启动一个 for 循环,该循环用他的索引号指示输入数组,因此他将抛出数组的所有索引号(其中一个引发加一,这样它们的值就不会相同)。在代码的最后,你有 if 语句。

于 2018-10-08T10:19:50.907 回答
0

您可以简单地执行以下操作;

function getNeigboringMaxProduct([x,...xs], r = -Infinity){
  var p = x * xs[0];
  return xs.length ? getNeigboringMaxProduct(xs, p > r ? p : r)
                   : r;
}

var arr = [3, 6, -2, -5, 7, 3],
    res = getNeigboringMaxProduct(arr);
console.log(res);

于 2017-07-04T15:14:37.927 回答