मान लीजिए कि हमारे पास एक गैर-ऋणात्मक पूर्णांक n है, और हमें इसका एन्कोडेड रूप खोजना है। एन्कोडिंग रणनीति इस प्रकार होगी -
| संख्या | एन्कोडेड नंबर |
|---|---|
| 0 | “” |
| 1 | “0” |
| 2 | “1” |
| 3 | ”00” |
| 4 | ”01” |
| 5 | ”10” |
| 6 | ”11” |
| 7 | ”000” |
तो अगर संख्या 23 है, तो परिणाम 1000 होगा, यदि संख्या 54 है, तो यह 10111 होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- बिन नामक एक विधि बनाएं, इसमें n और k लगेंगे, यह विधि नीचे की तरह कार्य करेगी
- res:=खाली स्ट्रिंग
- जबकि n> 0
- res :=res + n mod 2 का अंक
- n :=n /2
- नंबर को उल्टा करें
- जबकि x> रेस की लंबाई
- res :=0 को रेस के साथ प्रीपेन्ड करें
- रिटर्न रेस
- वास्तविक विधि इस प्रकार होगी -
- यदि n =0 है, तो खाली स्ट्रिंग लौटाएं, यदि n 1 है, तो "0" लौटाएं, या जब n 2 हो, तो "1" लौटाएं
- x :=लॉग एन बेस 2
- यदि 2 ^ (x + 1) - 1 =n, तो
- उत्तर:=खाली स्ट्रिंग
- x को 1 से बढ़ाएं
- जबकि x 0 नहीं है, तो ans :=0 को उत्तर के साथ जोड़ें, और x को 1 से बढ़ाएँ
- वापसी उत्तर
- रिटर्न बिन(n – 2^x + 1, x)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string bin(int n, int x){
string result = "";
while(n>0){
result += (n%2) + '0';
n/=2;
}
reverse(result.begin(), result.end());
while(x>result.size())result = '0' + result;
return result;
}
string encode(int n) {
if(n == 0)return "";
if(n == 1)return "0";
if(n==2) return "1";
int x = log2(n);
if(((1<<(x+1)) - 1) == n){
string ans = "";
x++;
while(x--)ans+="0";
return ans;
}
return bin(n - (1<<x) + 1, x);
}
};
main(){
Solution ob;
cout << (ob.encode(23)) << endl;
cout << (ob.encode(56)) << endl;
} इनपुट
23 54
आउटपुट
1000 11001