ধরুন আমাদের একটি সংখ্যা n আছে; আমাদেরকে বাইনারি আকারে n-এর মতো 1s-এর সমান সংখ্যা সহ সবচেয়ে ছোট পরবর্তী উচ্চতর সংখ্যাটি খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি n =7 এর মত হয়, তাহলে আউটপুট হবে 11, যেহেতু বাইনারিতে 7 হল 0111 এবং 7 থেকে পরবর্তী উচ্চতর তিনটি সহ 11 হবে যা বাইনারিতে 1011।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব:
-
অনুলিপি :=n, শূন্য :=0, ones :=0
-
কপি 0 না হলে এবং কপি জোড় হয়, করুন
-
শূন্য :=শূন্য + 1
-
অনুলিপি =অনুলিপি / 2
-
-
যখন অনুলিপি বিজোড় হয়, করুন
-
ones :=ones + 1
-
অনুলিপি =অনুলিপি / 2
-
-
ডান:=ones + শূন্য
-
n :=n বা (2^ডান)
-
n :=n এবং ((2^ডান) - 1)
এর বিপরীত -
n :=n OR((2 ^ (একটি - 1)) - 1
-
ফেরত n
আরও ভালভাবে বোঝার জন্য আসুন নিম্নলিখিত বাস্তবায়ন দেখি:
উদাহরণ
class Solution: def solve(self, n): copy = n zeros = 0 ones = 0 while copy and not copy & 1: zeros += 1 copy >>= 1 while copy & 1: ones += 1 copy >>= 1 right = ones + zeros n |= 1 << right n &= ~((1 << right) - 1) n |= (1 << ones - 1) - 1 return n ob = Solution() n = 7 print(ob.solve(n))
ইনপুট
7
আউটপুট
11