2017-03-11 9 views
3

ここでスタックにありますが、私はいくつかの変更が必要です。Javascript - パーミュテーションは重複要素を削除します

function perms(data) { 
    if (!(data instanceof Array)) { 
     throw new TypeError("input data must be an Array"); 
    } 

    data = data.slice(); // make a copy 
    var permutations = [], 
     stack = []; 

    function doPerm() { 
     if (data.length == 0) { 
      permutations.push(stack.slice()); 
     } 
     for (var i = 0; i < data.length; i++) { 
      var x = data.splice(i,1); 
      stack.push(x); 
      doPerm(); 
      stack.pop(); 
      data.splice(i, 0, x); 
     } 
    } 

    doPerm(); 
    return permutations; 
} 

var input = "552".split(''); 
var result = perms(input); 
for (var i = 0; i < result.length; i++) { 
    result[i] = result[i].join('-'); 
} 

その結果は次のとおり

5-5-2

5-2-5

5-5-2

5-2-5

2-5-5

5-5-2

5-2-5

2-5-5

:2-5-5

しかし、3つの要素であり、結果がでなければならない複製します

どうすればその問題を解決できますか?

+0

あなたはそれを見つけましたか?質問に参考文献を含めることができますか、おそらくあなたが試したことはありますか? –

答えて

1

あなたが得るので基本的には、1つの問題は、

var x = data.splice(i, 1)[0]; 
//      ^^^ is missing 

を持っていますスプライシングを伴う配列その結果、これは位置iに配列後で挿入

data.splice(i, 0, x); 

深いネストされた配列です。実際の値が既にアレイをテストし、不一致ならば、プッシュが行われる

permutations.some(function (a) { 
    return a.every(function (b, j) { 
     return stack[j] === b; 
    }); 
}) || permutations.push(stack.slice()); 

結果セット内に挿入された場合、重複を防止するため

は、あなたがチェックを必要とします。

function perms(data) { 
 
    if (!(data instanceof Array)) { 
 
     throw new TypeError("input data must be an Array"); 
 
    } 
 

 
    data = data.slice(); // make a copy 
 
    var permutations = [], 
 
     stack = [], 
 
     hash = Object.create(null); 
 

 
    function doPerm() { 
 
     if (data.length == 0) { 
 
      permutations.some(function (a) { 
 
       return a.every(function (b, j) { 
 
        return stack[j] === b; 
 
       }); 
 
      }) || permutations.push(stack.slice()); 
 
      return; 
 
     } 
 
     for (var i = 0; i < data.length; i++) { 
 
      var x = data.splice(i, 1)[0]; 
 
      stack.push(x); 
 
      doPerm(); 
 
      stack.pop(); 
 
      data.splice(i, 0, x); 
 
     } 
 
    } 
 

 
    doPerm(); 
 
    return permutations; 
 
} 
 

 
var input = "552".split(''); 
 
var result = perms(input); 
 
for (var i = 0; i < result.length; i++) { 
 
    result[i] = result[i].join('-'); 
 
} 
 

 
console.log(result);

+0

パーフェクト.. !!!!! –

1

配列arrayはArray.prototype.some()を使用して.push()を呼び出す前に、配列を結果内に存在するかどうかをチェックし、Array.prototype.join()

function p(a, b, res) { 
 
    var b = b || [], 
 
    res = res || [], 
 
    len = a.length; 
 
    if (!len) { 
 
    // check if `res` contains `b.join("")` 
 
    if (!res.length 
 
     || !res.some(function(n) { 
 
      return n.join("") === b.join("") 
 
      })) 
 
     res.push(b) 
 
    } else { 
 
    for (var i = 0 
 
     ; i < len; p(a.slice(0, i).concat(a.slice(i + 1, len)) 
 
      , b.concat(a[i]), res) 
 
      , i++); 
 
    } 
 
    return res 
 
} 
 

 
var result = p("552".split("")); 
 

 
result = result.map(function(res) { 
 
    return res.join("-") 
 
}); 
 

 
console.log(result);

+0

OP https://jsfiddle.net/xqLm7f6o/の 'perms'関数内の' if'条件で '.some()'、 '.join()'を利用しています。参照[再帰関数呼び出しを伴わない順列](http://stackoverflow.com/questions/34013675/permutations-without-recursive-function-call) – guest271314

関連する問題