สมมติว่าเรามีจำนวนเต็มที่ไม่เป็นลบ n และเราต้องหารูปแบบที่เข้ารหัสของมัน กลยุทธ์การเข้ารหัสจะเป็นดังนี้ -
| หมายเลข | หมายเลขที่เข้ารหัส |
|---|---|
| 0 | “” |
| 1 | “0” |
| 2 | “1” |
| 3 | ”00” |
| 4 | ”01” |
| 5 | ”10” |
| 6 | ”11” |
| 7 | ”000” |
ดังนั้นหากตัวเลขคือ 23 ผลลัพธ์จะเป็น 1,000 หากตัวเลขคือ 54 จะเป็น 10111
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างเมธอดหนึ่งอันเรียกว่า bin ซึ่งจะใช้เวลา n และ k วิธีนี้จะทำหน้าที่ดังต่อไปนี้
- res :=สตริงว่าง
- ในขณะที่ n> 0
- res :=res + ตัวเลขของ n mod 2
- n :=n /2
- ย้อนกลับจำนวนความละเอียด
- ในขณะที่ x> ความยาวของความละเอียด
- res :=เติม 0 ด้วย res
- ผลตอบแทน
- วิธีที่แท้จริงจะเป็นดังนี้ -
- ถ้า n =0 ให้คืนค่าสตริงว่าง ถ้า n เป็น 1 ให้คืนค่า "0" หรือเมื่อ n เป็น 2 ให้คืนค่า "1"
- x :=บันทึก n ฐาน 2
- ถ้า 2 ^ (x + 1) – 1 =n แล้ว
- ans :=สตริงว่าง
- เพิ่ม x ขึ้น 1
- ในขณะที่ x ไม่ใช่ 0 ดังนั้น ans :=ให้เติม 0 ด้วย ans และเพิ่ม 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