[英]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.