কম্পিউটার টিউটোরিয়াল

সি++-এ নন-নেগেটিভ ইন্টিজার বিনা কনsekutিভ ওয়ান (Non-negative Integers without Consecutive Ones)

মনে করুন, একটি ধনাত্মক পূর্ণসংখ্যা n দেওয়া আছে। n-এর চেয়ে ছোট বা সমান অ-ঋণাত্মক পূর্ণসংখ্যাগুলোর মধ্যে যাদের বাইনারি রিপ্রেজেন্টেশনতে কনsekutিভ ১ নেই, তাদের সংখ্যা বের করতে হবে।

যেমন, n = 7 হলে, উত্তর ৫। কারণ ৫-এর বাইনারি 101।

সমাধানের ধাপসমূহ

  • convert(n) ফাংশন: n-এর বাইনারি স্ট্রিং রিটার্ন করুন (LSB প্রথমে)
  • bits := convert(num), n := bits.size()
  • ones[n], zeroes[n] অ্যারে: ones[0]=zeroes[0]=1
  • i := 1 থেকে n-1: zeroes[i] = zeroes[i-1]+ones[i-1], ones[i] = zeroes[i-1]
  • ret := ones[n-1] + zeroes[n-1]
  • i := n-2 থেকে ০ পর্যন্ত:
    • যদি bits[i]=='0' এবং bits[i+1]=='0', ret -= ones[i]
    • যদি bits[i]=='1' এবং bits[i+1]=='1', ব্রেক করুন
  • 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
  1. C++-এ র‍্যান্ডম পয়েন্টারসহ লিঙ্কড লিস্টের ডিপ কপি (Deep Copy)

  2. C++-এ এক্সপ্রেশন ট্রি (Expression Tree) উদাহরণসহ

  3. C++-এ কি-সহ পারমিউটেশন কুয়েরি প্রসেস করুন

  4. C++-এ ৩n স্লাইস পিজা (Pizza With 3n Slices)