分区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 ] ]
猜你喜欢