【问题标题】:Find largest adjacent product in array (JavaScript)在数组中查找最大的相邻产品(JavaScript)
【发布时间】:2017-12-07 10:24:30
【问题描述】:

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

例子:

 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”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻的产品最大。

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

谢谢。

干杯!

【问题讨论】:

  • 1 - 阅读扩展文档,或转译到 ES5 以查看它的作用 transpiled here, 2 - 因为数组中有 n 个项目,您想要检查 n - 1 个产品

标签: javascript arrays algorithm spread-syntax


【解决方案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 语句。

【讨论】:

  • 我已经声明了一个变量,该变量由两个带索引号的输入数组组成,然后启动一个 for 循环,用他的索引号指示输入数组,这样他就会抛出数组的所有索引号(其中一个由一个提升,因此它们的值不会相同)。在代码的最后,你有 if 语句。希望对您有所帮助。
【解决方案2】:

你可以简单地做如下;

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);

【讨论】:

    【解决方案3】:

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

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

    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”,因为我们想从头开始,然后循环遍历所有内容,看看哪个相邻的产品最大。

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

    [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 个相邻数字的乘积数组。

    【讨论】:

    • 非常感谢您的详尽解释!
    • 欢迎 :) 不要忘记点击链接,以获取有关传播和应用如何工作的更多信息。
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2018-04-10
    • 2019-07-10
    • 2018-07-13
    • 2015-10-30
    相关资源
    最近更新 更多