將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 ] ]

更新於:2020年11月21日

91 次瀏覽

啟動您的職業生涯

完成課程後獲得認證

開始
廣告