var arr = [0,1,2,3,4,5,6,7,8,9];
如果我没错的话,所有可能的排列数组的数量是唯一值(无重复项):
[5,9,1,8,2,6,7,0,4,3] [4,8,0,2,1,9,7,3,6,5] ...
2x3x4x5x6x7x8x9x10 = 3628800
我正在尝试创建一个动态生成'n'数组的函数。例如:
function createArray(0) -> [0,1,2,3,4,5,6,7,8,9]
function createArray(45648) -> [0,1,5,3,2,8,7,9,6] (something like...)
function createArray(3628800) -> [9,8,7,6,5,4,3,2,1,0]
我想实现的方法是:
使用createArray(1)将最后2个符号进行排列(8,9 -> 9,8)
使用createArray(2->6)将最后3个符号进行排列(8,7,9 -> 9,8,7)
使用createArray(3628800):所有值均被排列(从9到0)
你认为这个任务是否可行/容易,如果是,如何继续?
[编辑]
感谢有用的回答。
function permute(permutation, val) {
var length = permutation.length,
result = [permutation.slice()],
c = new Array(length).fill(0),
i = 1, k, p,
n = 0;
while (i < length) {
if (c[i] < i) {
if (n <= val) {
k = i % 2 && c[i];
p = permutation[i];
permutation[i] = permutation[k];
permutation[k] = p;
++c[i];
i = 1;
if (n == val) {
arr = permutation.slice();
console.log("n="+n+"\n"+arr);
console.log( 'Duration: '+((new Date() - t1)/1000)+'s' );
break;
}
else { n+=1; }
}
} else {
c[i] = 0;
++i;
}
}
}
let t1 = new Date();
permute([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 100000); // <- array requested
控制台: n=100000 + 0.5,8,1,7,2,3,6,4,9 + 耗时: 0.004秒