我有以下功能
function permutation(a){
let res = [];
for(let i=0; i<a.length; i++){
let restA = a.slice(0,i).concat(a.slice(i+1));
let rest = permutation(restA);
if(rest.length === 0){
res.push([a[i]]);
}else{
for(let j=0; j<rest.length; j++){
res.push([a[i]].concat(rest[j]));
}
}
}
return res;
}
生成具有[1,2,3,4]
等唯一值的1D数组的所有排列。
我还有一个二维数组填充零和这样的
[
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1]
]
我需要生成此数组的所有唯一排列。我该怎么做?
答案 0 :(得分:0)
你可以忽略它是一个二维数组的事实,并认为它是34位值,34 1和30 0。通过这些位的每个有效组合,您可以构建一个独特的2D阵列(每行8位)。
但是,如果你进行数学计算,你会发现创建所有这些组合并不是真的可行:
64! / ( 34! * 30!) = 1.620288e+18
这几乎与无符号64位范围(1.8e+19)一样大 - 它几乎是其中的十分之一。
话虽如此,如果你真的想要这样做,只需迭代一个64位无符号整数,从0到MAXVALUE,并在每次迭代中测试“on”位数 - 如果它是34,你就找到了一个有效的组合