繁体   English   中英

Javascript - Permutations删除重复元素

[英]Javascript - Permutations remove the duplicates elements

这是在堆栈中找到但我想要一些改变。

    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

我该如何解决这个问题。

基本上,你有一个问题,

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());

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

 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); 

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

 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM