Computer >> Máy Tính >  >> Lập trình >> Javascript

Phân vùng N trong đó số lượng các bộ phận và mỗi bộ phận là lũy thừa của 2, kích thước và số lượng bộ phận bị hạn chế trong JavaScript

Chúng tôi được yêu cầu viết một hàm JavaScript sử dụng một số. Hàm sẽ chia số thành nhiều phần theo các quy tắc sau -

  • Số phần phải là lũy thừa của − hai,

  • Mỗi đoạn cũng phải có số lượng vật phẩm theo lũy thừa là hai (trong đó kích thước tăng lên thành công suất tối đa là hai, do đó, 1, 2, 4, 8, 16, 32, 32 là giá trị tối đa)

Do đó, ví dụ:8 có thể được chia thành 1 nhóm -

[8]

9 có thể là -

[8, 1]

Điều đó hoạt động vì cả hai số đều là lũy thừa của hai và kích thước của mảng là 2 (cũng là lũy thừa của hai).

Hãy thử 11 -

[8, 2, 1]

Không, điều đó không hoạt động.

Bởi vì kích thước của mảng là 3, không phải là lũy thừa của hai, mặc dù nó thêm vào 11.

[4, 4, 2, 1]

Điều đó hoạt động! Đó là 4 yếu tố là sức mạnh của hai.

Ví dụ

Mã cho điều này sẽ là -

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));

Đầu ra

Và đầu ra trong bảng điều khiển sẽ là -

[ [ 1, 1 ], [ 2, 1 ], [ 4, 2 ], [ 8, 0 ], [ 16, 0 ], [ 32, 0 ] ]