Javascript - Permutations删除重复元素

时间:2017-03-11 20:10:49

标签: 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

2-5-5

但是,3个元素重复,结果必须是:

5-5-2

5-2-5

2-5-5

我该如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

基本上,你有一个问题,

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

因为你得到一个带拼接的数组。结果是一个带有

的深层嵌套数组
data.splice(i, 0, x);

这会稍后在位置i上插入数组。

为防止重复,如果实际值已插入结果集中,则需要检查

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

测试数组,如果不匹配,则执行推送。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在使用.push()Array.prototype.some()

调用Array.prototype.join()之前,检查结果数组中是否存在数组数组

&#13;
&#13;
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);
&#13;
&#13;
&#13;