2016-11-18 2 views
0

JavaScriptの2-Sum問題に対する簡単な解を書こうとしています。問題は次のようになります。n個の整数とターゲット合計の配列が与えられた場合、2つの整数のどの組み合わせがターゲット値に加算されるかを決定します。JavaScriptの2-sumアルゴリズムを解く

私は、ハッシュテーブルを使用して、いくつかの異なる言語に依存しない例を発見し、JavaScriptで解決策を考え出すことを試みた:

// Integer set: 
arr = [1,4,2,3,0,5]; 
// Target sum: 
arg = 7; 

// Generate hash table 
hashTable = {}; 
arr.forEach(function(value, index){ 
    hashTable[value] = index; 
}); 

// hashTable = { 
// 0: 4, 
// 1: 0, 
// 2: 2, 
// 3: 3, 
// 4: 1, 
// 5: 5, 
// } 


for (var i = 0; i < arr.length; i++) { 
    if (hashTable[arg - arr[i]]) { 
     console.log([hashTable[arg - arr[i]], i]) 
    } 
} 

ソリューションは4,3と5,2でなければなりませんが、私は3を取得しています、 1 5,2 1,3および2,5。私はペンと紙を使ってforループを歩くことができます。私は間違ったことをしているのを見ていますが、私が見つけたlangaugeの無関係な例(例えばherehere)に従っていると確信しています。どんな助けもありがとう。ここで

+0

を[非常に簡潔なソリューション](HTTPがあります://stackoverflow.com/a/4720397/975097)をこのpに追加しますJavaScriptに翻訳するのが比較的簡単なものです。 –

+0

ループ7-4の2番目のパスは3です。残りの惑星とは別の数学平面で操作していますか? 'hashTable [3]'はまだ3になります。 – PHPglue

+0

@PHPglueごめんなさいあなたは何を得ているのか本当に分かりません。そのソートされていないリストと値3はインデックス3にあることになります。 –

答えて

0

、あなたの出力指数加数の、あなたはその必要ながら:

console.log([hashTable[arg - arr[i]], i]) 

をあなたはこれらの値を取得する理由です:

  • 3、1。つまり、インデックス3のアイテム+インデックス1のアイテム= 7
  • 5,2;

    // Integer set: 
     
    var arr = [1,4,2,3,0,5]; 
     
    // Target sum: 
     
    var arg = 7; 
     
    
     
    // Generate hash table 
     
    var hashTable = {}; 
     
    arr.forEach(function(value, index){ 
     
        hashTable[value] = index; 
     
    }); 
     
    
     
    
     
    for (var i = 0; i < arr.length; i++) { 
     
        if (hashTable[arg - arr[i]]) { 
     
         console.log([arr[hashTable[arg - arr[i]]], arr[i]]); 
     
        } 
     
    }

    :これは2 = 7等

arr[i]への出力にiを変更してみてください、そしてarr[hashTable[arg - arr[i]]]hashTable[arg - arr[i]]は、それが動作するはずのインデックスでインデックス5 +アイテムの項目を意味します

4 + 3 = 7と3 + 4 = 7も同様に対称的な結果が得られることに注意してください。
ソリューションを挿入しながらチェックすることによって最適化することができる。

var arr = [1, 4, 2, 3, 0, 5]; 
 
var arg = 7; 
 

 
var hashtable = {}; 
 
arr.forEach(function(x) { 
 
    hashtable[x] = true; 
 
    if (hashtable[arg - x]) 
 
    console.log([arg - x, x]); 
 
})

+0

hmmでなければなりません。はい、それは理にかなっています。あなたの変更はi = 1だがi = 3のときは出力が[1,3](hashTableのキー4に値1があるため)に固定されています。 –

+0

@SolomonBothwellああ、はい、あなたも値を必要とするので、最初のsummandを 'arr [] 'で囲む必要があります。私の更新された答えを見てください。 –

+0

ああ私は見る!本当にありがとう。あなたの短縮された答えは本当にクールに見えます。私は今それを勉強しています。 –

0

これを試してみてください:

function sumPairs(inputArray, expectedSum){ 
 
    var a = inputArray.slice(), b = inputArray.slice(), l = a.length, p = []; 
 
    for(var i=0,av; i<l; i++){ 
 
    av = a[i]; 
 
    for(var n=1,bv; n<l; n++){ 
 
     bv = b[n]; 
 
     if(av + bv === expectedSum){ 
 
     p.push([av, bv]); 
 
     } 
 
    } 
 
    } 
 
    return p; 
 
} 
 
console.log(sumPairs([1,4,2,3,0,5], 7));

関連する問題