মান লিইয়ে নিই একটি পজিটিভ ইন্টিজার n রয়েছে। আমাদের n-এর চেয়ে ছোট বা সমান নন-নেগেটিভ ইন্টিজার বের করতে হবে। শর্ত হল বাইনারি রিপ্রেজেন্টেশন-এ.Sequential 1 থাকবে না। সুতরাং যদি ইনপুট 7 হয়, তবে উত্তর হবে 5, কারণ 5-এর বাইনারি রিপ্রেজেন্টেশন 101।
समाधान पद्धति
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- convert() ফাংশন সংজ্ঞায়িত করুন, যা n গ্রহণ করবে,
- ret := খালি স্ট্রিং
- যতক্ষণ n নন-জিরো, করুন:
- ret := ret + (n mod 2)
- n := n কে ১ বার রাইট শিফ্ট করুন
- ret ফেরত দিন
- মূল পদ্ধতিতে নিম্নলিখিত কাজ করুন:
- bits := convert(num) ফাংশন কল করুন
- n := bits-এর আকার
- আকার n-এর একটি ones সরণি, আকার n-এর একটি zeroes সরণি সংজ্ঞায়িত করুন
- ones[0] := 1, zeroes[0] := 1
- i := 1 থেকে आरंभ করুন, जब i < n, আপডেট করুন (i 1 বাড়ান), করুন:
- zeroes[i] := zeroes[i - 1] + ones[i - 1]
- ones[i] := zeroes[i - 1]
- ret := ones[n - 1] + zeroes[n - 1]
- i := n - 2 থেকে आरंभ করুন, जब i >= 0, আপডেট করুন (i 1 কমান), করুন:
- যদি bits[i] '0'-এর সমান হয় এবং bits[i + 1] '0'-এর সমান হয়, তবে:
- ret := ret - ones[i]
- অন্যথায় যদি bits[i] '1'-এর সমান হয় এবং bits[i + 1] '1'-এর সমান হয়, তবে:
- লুপ থেকে বের হোন
- যদি bits[i] '0'-এর সমান হয় এবং bits[i + 1] '0'-এর সমান হয়, তবে:
- ret ফেরত দিন
उदाहरण
बेहतर समझ के लिए निम्नलिखিত कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; class Solution { public: string convert(int n){ string ret = ""; while(n){ ret += (n % 2) + '0'; n >>= 1; } return ret; } int findIntegers(int num) { string bits = convert(num); int n = bits.size(); vector <int> ones(n); vector <int> zeroes(n); ones[0] = zeroes[0] = 1; for(int i = 1; i < n; i++){ zeroes[i] = zeroes[i - 1] + ones[i - 1]; ones[i] = zeroes[i - 1]; } int ret = ones[n - 1] + zeroes[n - 1]; for(int i = n - 2; i >= 0; i--){ if(bits[i] == '0' && bits[i + 1] == '0') ret -= ones[i]; else if(bits[i] == '1' && bits[i + 1]== '1') break; } return ret; } }; main(){ Solution ob; cout << (ob.findIntegers(7)); }
इनपुट
7
आउटपुट
5