-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]]))
  }

私は2つのことを理解するのに苦労しています:

  1. 3 つのドットは正確には何をし、これはどのように関数に渡されるのでしょうか? これをもっと分かりやすく書く方法はありますか?それがES6の「拡散構文」機能であることは知っていますが、まだ完全には理解していません。

  2. スライスの引数として「1」を挿入するのはなぜですか? 最初に「0」を入力しました。これは、最初から開始し、すべてをループして、どの隣接する製品が最大かを確認するためです。

アドバイス、リンク、説明をいただければ幸いです。

ありがとう。

乾杯!

4

3 に答える 3

1

1. 3 つのドットは正確には何をし、これはどのように関数に渡されますか? これをもっと分かりやすく書く方法はありますか?それが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)配列は の 2 番目の要素から始まるためinputArray、インデックス ( i) は の 1 番目の要素を指し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 ループを開始します。同じ値にならないように 1 つずつ)。コードの最後に if ステートメントがあります。

于 2018-10-08T10:19:50.907 に答える