मान लीजिए हमारे पास एक गैर-ऋणात्मक पूर्णांक n है, और हमें उसका एन्कोडेड रूप ढूंढना है। एन्कोडिंग रणनीति निम्नलिखित होगी:
| संख्या | एन्कोडेड संख्या |
|---|---|
| 0 | "" |
| 1 | "0" |
| 2 | "1" |
| 3 | "00" |
| 4 | "01" |
| 5 | "10" |
| 6 | "11" |
| 7 | "000" |
इसलिए यदि संख्या 23 है, तो परिणाम 1000 होगा, यदि संख्या 54 है, तो यह 10111 होगा।
इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:
binनामक एक विधि बनाएं, जोnऔरkलेगी, यह विधि निम्नानुसार कार्य करेगी:res := खाली स्ट्रिंग- जब तक
n > 0res := res + (n mod 2) का अंकn := n / 2
resको उल्टा करें- जब तक
x > res की लंबाईres := res के साथ 0 प्रीपेंड करें
resलौटाएं- वास्तविक विधि निम्नानुसार होगी:
- यदि
n = 0, तो खाली स्ट्रिंग लौटाएं, यदिn = 1, तो"0"लौटाएं, या जबn = 2, तो"1"लौटाएं x := log n आधार 2- यदि
2 ^ (x + 1) - 1 = n, तोans := खाली स्ट्रिंगxको 1 से बढ़ाएं- जब तक
x0 नहीं है,ans := ans के साथ 0 जोड़ें, औरxको 1 से बढ़ाएं ansलौटाएं
bin(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