这是在堆栈中找到的,但我想要一些更改。
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
我怎样才能解决这个问题。
发布于 2017-03-12 04:45:33
基本上,你有一个问题,
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);
发布于 2017-03-12 04:35:58
在使用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);
https://stackoverflow.com/questions/42740080
复制相似问题