將N劃分成多個部分,每個部分的個數和大小都是2的冪,並且在JavaScript中限制部分大小和個數
我們需要編寫一個JavaScript函式,該函式接收一個數字作為輸入。該函式應根據以下規則將數字分成塊:
塊的數量應為2的冪;
每個塊也應該有2的冪個元素(大小最大為2的冪,例如1, 2, 4, 8, 16, 32,最大值為32);
例如,8可以分成1個桶:
[8]
9可以分成:
[8, 1]
這是可行的,因為這兩個數字都是2的冪,陣列的大小也是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 ] ]
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP