2017-05-08 9 views
0

私はCodeFightsでJavaScript問題のコードを記述しようとしています。配列の1対の要素を入れ替え、それらが等しいかどうかを調べるにはどうすればいいですか?

1つの配列の要素のスワップで別の配列を取得できる場合、2つの配列は同様に呼び出されます。

これはこれまで私が思い付いたことです。私が遭遇した問題は、このコードがすべてのテストに合格していないことです。

function areSimilar(a, b) { 
    if (a.join() === b.join()) { 
     return true; 
    } 
    for (var i = 0; i < a.length-1; i++) { 
     for (var j = 1; j < a.length; j++) { 
      if (swap(a, i, j).join()=== b.join()) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

function swap(target, start, end) { 
    var temp = target[start]; 
    target[start] = target[end]; 
    target[end] = temp; 
    return target; 
} 

私は(if文の後)10行目に次のコードを追加した場合、それはテストの過去ではなく、出力時間行います。誰かが正しい方向に私を指すことができれば

console.log(swap(a,i,j)); 

を何を研究するのか、なぜこれが起こっているのか、私はそれを高く評価します。

+1

です。各スワップの前に配列のコピーを作成する必要があります。 – Barmar

+0

すべての可能な順列を試すことは、この課題を解決するうえで貧弱な方法です。もっとスマートなものを考えてみてください。(コンピュータなしで2枚のカードがあれば、どうすればいいでしょうか?) – georg

答えて

0

swap()は、元の配列を変更するのではなく、新しい配列を返す必要があります。それ以外の場合は、配列に複数のスワップを蓄積しています。

function swap(target, start, end) { 
 
    var result = target.slice(); // Make copy of target 
 
    result[start] = target[end]; 
 
    result[end] = target[start]; 
 
    return result; 
 
} 
 

 
function areSimilar(a, b) { 
 
    if (a.join() === b.join()) { 
 
    return true; 
 
    } 
 
    for (var i = 0; i < a.length - 1; i++) { 
 
    for (var j = 1; j < a.length; j++) { 
 
     if (swap(a, i, j).join() === b.join()) { 
 
     return true; 
 
     } 
 
    } 
 
    } 
 
    return false; 
 
} 
 

 
console.log(areSimilar([1, 2, 3, 4], [1, 3, 2, 4])); 
 
console.log(areSimilar([1, 2, 3, 4, 5], [1, 3, 2, 5, 4])); 
 
console.log(areSimilar([1, 2, 6, 4, 5], [1, 2, 3, 5, 4]));

あなたが作ることができますいくつかの他の改良点:二つの配列が同じ長さであることを

  1. をチェック。
  2. 内側ループは、j = 1の代わりにj = i + 1で始まります。そうすれば、同じ要素のペアを逆の順序でテストしたり、要素をそれ自身と入れ替えたりすることはありません。
  3. b.join()のコピーを変数に保存しておきます。
+0

ありがとうございました。 – jsrco

0

ここでの問題は、あなたが同じアレイ上の複数のスワップをやっているということであるO(n)の時間とO(n)のスペース・ソリューション

function areSimilar(arr1, arr2) { 
 
     if (arr1.length !== arr2.length) return false; 
 

 
     let diff = [];// initialize array that'll be used to track indices where values differ 
 
     
 
     for (let i = 0; i < arr1.length; i++) {// loop thru first array 
 
     if (arr1[i] !== arr2[i]) { //check for value differences between arrays at each index 
 
      diff.push(i); //if the values differ push index into diff array 
 
      
 
      if (diff.length > 2) return false; 
 
      
 
      if (diff.length === 2) { 
 
      // use the diff array indices to swap, if swapped pairs are not eqaul return false; 
 
      if (arr1[diff[0]] !== arr2[diff[1]] || arr1[diff[1]] !== arr2[diff[0]]) { 
 
       return false; 
 
      } 
 
      } 
 
     } 
 
     } 
 
     //if it makes it through all of that 
 
     return diff.length === 0 || diff.length === 2; 
 
    } 
 

 

 
console.log(areSimilar([1, 2, 3, 4], [1, 3, 2, 4])); 
 
console.log(areSimilar([1, 2, 3, 4, 5], [1, 3, 2, 5, 4])); 
 
console.log(areSimilar([1, 2, 6, 4, 5], [1, 2, 3, 5, 4]));

関連する問題