2017-12-30 63 views
0

この質問を解決するには2つの異なる関数があります。2異なる結果を持つ配列から要素のペアを見つける方法

しかし、彼らの両方が非常に異なる結果を生成している「の合計与えられた数に等しい配列からの要素のペアを見つけます」。なぜ彼らは同じ結果を生み出していないのですか? 1組は5組、残りの組は6組です。これはなぜですか?

1つはダブルループを使用しています。

export function pairElements(arr, arg) { 
    var pairArr = arr.slice(); // return a copy of arr 
    var result=[]; 
    for(var i = 0; i < pairArr.length; i++) { 
    for(var j = i + 1; j < pairArr.length; j++) { 
     if(pairArr[i] + pairArr[j] == arg) { 
     let pair = [pairArr[i], pairArr[j]]; 
     result.push(pair); 
    } 

    } 
} 
return result; 
} 

pairElements([1,4,2,3,0,5,4,3], 7); 
result = [ [4, 3], [4, 3], [2, 5], [3, 4], [4, 3] ]; 

目は最初のアプローチは、本質的には非常に単純で、まだ正しい方法

function pairReduce(arr, arg) { 
    var pairArr = arr.slice(); 
    var result=[]; 
    return pairArr.reduce(function (a,b,index){ 
     let pair = []; 
     let search = arg - b; // get difference of current item so we know what value will sum to arg 
     let searchIndex = pairArr.indexOf(search); 

     if (searchIndex != -1 && searchIndex != index){ 
     pair.push(b, search); 
     result.push(pair); 
     } 
     return result; 
    }, 0); 
} 

pairReduce([1,4,2,3,0,5,4,3], 7)); 
result = [ [4, 3], [2, 5], [3, 4], [5, 2], [4, 3], [3, 4] ] 
+0

ロジックは全く異なります。どんな運動の目的が明確でないか – charlietfl

+0

私はそれを集める!それでも私の質問には答えません。なぜ5ペアを生産しているのですか?もう1ペアは6ペアです。 –

+0

デバッガを使ってそれを把握してください。 1つは複数のループを持ち、もう1つはまったく異なるものです。あなたはリンゴとオレンジを比較するように私達に求めています – charlietfl

答えて

0

を減らす使用しています。各要素のためにあなたが行くのアレイでの残りの部分そのペアを探している要素(追加すると必要な結果が得られます)。例えば

、それは与えられた入力に何が起こるかです:

arr = [1,4,2,3,0,5,4,3] 
res = 7 

まず、1数(0番目の要素)がチェックされます。つまり、各次の要素(4から始まり、3で終わる)が追加され、結果は7と比較されます。ご覧のとおり、この配列には6はありません。

はその後、4数がチェックされ、そして今、物事はもう少し興味深いものにするために開始します。

4 + 2 = 6 // not added 
4 + 3 = 7 // added! 
4 + 0 = 4 // not added 
4 + 5 = 9 // not added 
4 + 4 = 8 // not added 
4 + 3 = 7 // added! 

ので、検索は同じ要素を次の2つのペアを与える - [4, 3]。 - それは、すでに収集されています。この繰り返しが「4まず、第1の3」のペアを収集することはありません。今、あなたはパターンを見始める

3 + 0 = 3; // - 
3 + 5 = 8; // - 
3 + 4 = 7; // + 
3 + 3 = 6; // - 

:それでは、明らかに(2, 5ペア)をスキップして3に行きましょう。しかし、それが集まったのは、first 3, second 4のペアです。どちらの選択も、与えられた要件に従うように見えます。

===

第2のアプローチはやや奇妙です。何らかの理由でその著者がindexOfを単純な操作として考えているだけでなく、ヒント:indexOfはその述語を満たす最初の要素を取得します。

ので、例えば、 reduce機能が 3の存在のために、その配列の最初の 4indexOfチェックを行く

- と見つけ3最初:

// reduce on b = 4, index = 1 
search = 7 - 4; // 3 
searchIndex = arr.indexOf(3); // 3 

しかし、その後まったく同じペアは、ブックときに入ります最初の3がチェックされます(再度indexOfが最初の4を収集するため)。

// reduce on b = 3, index = 3 
search = 7 - 3; // 4 
searchIndex = arr.indexOf(4); // 1 

しかし、このペアは重複していませんか?はい、そうです。皮肉なことに、このエラーは別のものによっても補償されます。つまり、同じ「初回」を第2の43の両方で再収集することです。

// reduce on b = 4, index = 6 
search = 7 - 4; // 3 
searchIndex = arr.indexOf(3); // 3 

// reduce on b = 3, index = 7 
search = 7 - 3; // 4 
searchIndex = arr.indexOf(4); // 1 

もう2つのペアが見つかりました - そして1つは見逃されました:アレイの最後の要素はペアになりません。

2番目の方法は修正できますか?

let searchIndex = pairArr.indexOf(search, index + 1); 

を...しかし、これは、それが独特の要素を持つ配列上で動作するでしょう:確かに、あなたは少しindexOfに第二引数を供給することによってそれを改善することができます。それ以外の場合は、明示的なループが必要です。このアプローチは、基本的には最初のものをもっと複雑に書き直すことになります。

+0

説明のためにおかげでraina77ow。あなたのコメントに基づいて最初の例は、ダブルループを使用して質問に答える正しいものですか? –

+0

はい、正しいです。 – raina77ow

+0

両方の方法を説明する時間を費やしてくれてありがとう、私はそれを非常に感謝します! –

関連する問題