分区 N,其中部分的数量和每个部分都是 2 的幂,并且部分大小和数量在 JavaScript 中受到限制
javascriptweb developmentfront end technologyobject oriented programming
我们需要编写一个接受数字的 JavaScript 函数。函数应根据以下规则将数字分成块 −
块数应为 2 的幂,
每个块还应具有 2 的幂数项(其中大小最大为 2 的幂,因此 1、2、4、8、16、32,32 为最大值)
因此,例如,8 可以分成 1 个桶 −
[8]
9 可以是 −
[8, 1]
这是可行的,因为两个数字都是 2 的幂,并且数组的大小为 2(也是二)。
我们试试 11 减去
[8, 2, 1]
不行。
因为数组的大小是 3,不是 2 的幂,即使它加起来是 11。
[4, 4, 2, 1]
行得通!它有 4 个元素,是 2 的幂。
示例
其代码为 −
function permuteCombinations(n, maximum){
const maxPowerOf2 = 1 << maximum;
const m = ~~(n / maxPowerOf2);
const A = new Array(maximum + 1).fill(0);
A[maximum] = m;
let num = n − m * maxPowerOf2;
let p = 0;
let bitCount = 0;
while (num){
if (num & 1){
bitCount += 1;
A[p] = 1;
}
num >>= 1;
p += 1;
}
const min = m + bitCount;
let target = 1;
while (target < min)
target *= 2;
if (target > n)
return −1;
if (target == min)
return A.map((c, p) => [1 << Number(p), c]);
if (target == n)
return [n];
target = target − min;
let i = m ? maximum : p;
while (target && i > 0){
if (!A[i]){
i −= 1;
continue;
}
const max = Math.min(target, A[i]);
A[i] −= max;
A[i−1] += 2*max;
target −= max;
i −= 1;
}
return target ? −1 : A.map((c, p) => [1 << Number(p), c]);
};
console.log(permuteCombinations(11, 5));
输出
控制台中的输出将是 −
[ [ 1, 1 ], [ 2, 1 ], [ 4, 2 ], [ 8, 0 ], [ 16, 0 ], [ 32, 0 ] ]
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

