আমাদের একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে হবে যা একটি সংখ্যা নেয়। ফাংশনটি নিম্নলিখিত নিয়ম অনুসারে সংখ্যাটিকে খণ্ডে ভাগ করতে হবে −
-
খণ্ডের সংখ্যা একটি পাওয়ার−of−দুই,
হওয়া উচিত -
প্রতিটি খণ্ডে একটি পাওয়ার-অফ-দুই সংখ্যক আইটেম থাকা উচিত (যেখানে আকার সর্বাধিক দুইটির পাওয়ার পর্যন্ত যায়, তাই 1, 2, 4, 8, 16, 32, 32 সর্বাধিক)
সুতরাং, উদাহরণস্বরূপ, 8 কে 1 বালতিতে ভাগ করা যেতে পারে −
[8]
9 হতে পারে −
[8, 1]
এটি কাজ করে কারণ উভয় সংখ্যাই দুটির শক্তি এবং অ্যারের আকার 2 (দুইটির একটি শক্তিও)।
আসুন 11 -
চেষ্টা করি[8, 2, 1]
না যে কাজ করে না।
কারণ অ্যারের আকার হল 3 যা 11 যোগ করলেও দুটির শক্তি নয়৷
[4, 4, 2, 1]
ওই কাজগুলো! এটি 4টি উপাদান যা দুটির শক্তি।
উদাহরণ
এর জন্য কোড হবে −
ফাংশন পারমুট কম্বিনেশন(n, সর্বোচ্চ){ const maxPowerOf2 =1 <<সর্বোচ্চ; const m =~~(n / maxPowerOf2); const A =নতুন অ্যারে(সর্বোচ্চ + 1).ফিল(0); A[সর্বোচ্চ] =m; let num =n − m * maxPowerOf2; যাক p =0; যাক bitCount =0; যখন (সংখ্যা){ যদি (সংখ্যা এবং 1){ বিটকাউন্ট +=1; A[p] =1; } সংখ্যা>>=1; p +=1; } const min =m + bitCount; যাক লক্ষ্য =1; যখন (লক্ষ্য <মিনিট) লক্ষ্য *=2; যদি (লক্ষ্য> n) −1 ফেরত দেয়; যদি (টার্গেট ==মিনিট) ফেরত দেয় A.map((c, p) => [1 <0){ যদি (!A[i]){ i −=1; চালিয়ে যাওয়া } const max =Math.min(লক্ষ্য, A[i]); A[i] -=সর্বোচ্চ; A[i−1] +=2*সর্বোচ্চ; লক্ষ্য -=সর্বোচ্চ; i −=1; } রিটার্ন টার্গেট? −1 :A.map((c, p) => [1 < আউটপুট
এবং কনসোলে আউটপুট হবে −
<প্রে>[ [ 1, 1 ], [ 2, 1 ], [ 4, 2 ], [ 8, 0 ], [ 16, 0 ], [ 32, 0 ] ]