如何在已排序的位置构建键的组合



我有keysplaces。我想把keys的元素代替places,在每一个组合中。但组合应遵守钥匙的顺序。

// I have this
let keys = [0, 1, 2, 3, 4, 5, 6, 7, 8]
let places = [0, 1, 2, 3, 4]
// I want all these arrays in an array
[0 1 2 3 4]
[0 1 2 3 5]
[0 1 2 3 6]
[0 1 2 3 7]
[0 1 2 3 8]
[0 1 2 4 5]
...
[0 2 5 7 8]
[0 2 6 7 8]
[0 3 4 5 6]
...
[4, 5, 6, 7]
[4, 5, 6, 8]
[4, 6, 7, 8]
[5, 6, 7, 8]

我不知道我必须构造什么样的for循环。甚至还有列表理解。

因为位置数组的长度可以更改。

感谢@QuentinUK,答案是这样的:

console.log(combinations([1,2,3,4,5], 3))
function combinations<A>(keys: Array<A>, nb: number) {
let combo = keys.map((_, i) => i >= keys.length - nb)
let res = []
do {
res.push(filter(keys, combo))
} while (nextPermutation(combo));
return res
}
function nextPermutation(array: Array<boolean>, first = 0, last = array.length-1) {
if(first>=last){
return false;
}
let i = last;
for(;;){
const i1 = i;
if(array[--i]<array[i1]){
let i2 = last+1;
while(array[i]>=array[--i2]);
[array[i], array[i2]] = [array[i2], array[i]];
reverse(array, i1, last);
return true;
}
if(i===first){
reverse(array, first, last);
return false;
}
}
}
function reverse<A>(array: Array<A>, i=0, j=array.length-1) {
while (i < j)
[array[i++], array[j--]] = [array[j], array[i]];
}
function filter<A>(a: Array<A>, select: Array<boolean>) {
return a.filter((_e,i) => select[i]);
}

最新更新