查找数组中最大的相邻产品 (JavaScript)
Find largest adjacent product in array (JavaScript)
我正在尝试了解以下用于在任何给定数组中查找最大相邻产品的解决方案。
示例:
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]]))
}
我很难理解两件事:
这三个点到底是做什么的,它是如何传递到函数中的?有没有办法以更容易理解的方式写这个?我知道这是ES6中的"spread syntax"特性,但还是没完全理解
为什么要插入“1”作为 slice 的参数?我的第一个虽然是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品最大。
如果有任何建议、链接和解释,我将不胜感激。
谢谢。
干杯!
1.这三个点到底是做什么的,它是如何传递到函数中的?有没有办法以更容易理解的方式写这个?我知道这是 ES6 中的某种 "spread" 特性,但仍然不完全理解。
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”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品最大。
让我们分解 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 个相邻数字的乘积数组。
您可以简单地做如下操作;
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);
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 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]]))
}
我很难理解两件事:
这三个点到底是做什么的,它是如何传递到函数中的?有没有办法以更容易理解的方式写这个?我知道这是ES6中的"spread syntax"特性,但还是没完全理解
为什么要插入“1”作为 slice 的参数?我的第一个虽然是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品最大。
如果有任何建议、链接和解释,我将不胜感激。
谢谢。
干杯!
1.这三个点到底是做什么的,它是如何传递到函数中的?有没有办法以更容易理解的方式写这个?我知道这是 ES6 中的某种 "spread" 特性,但仍然不完全理解。
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”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品最大。
让我们分解 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 个相邻数字的乘积数组。
您可以简单地做如下操作;
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);
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 语句。