Giả sử chúng ta có một số nguyên không âm n và chúng ta phải tìm dạng mã hóa của nó. Chiến lược mã hóa sẽ như sau -
Số | Số được mã hóa |
---|---|
0 | “” |
1 | “0” |
2 | “1” |
3 | ”00” |
4 | ”01” |
5 | ”10” |
6 | ”11” |
7 | ”000” |
Vì vậy, nếu số là 23, thì kết quả sẽ là 1000, nếu số là 54, thì sẽ là 10111
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Tạo một phương thức được gọi là bin, phương thức này sẽ lấy n và k, phương thức này sẽ hoạt động như bên dưới
- res:=chuỗi trống
- while n> 0
- res:=res + chữ số của n mod 2
- n:=n / 2
- đảo ngược số res
- while x> độ dài của res
- res:=thêm 0 trước res
- trả lại res
- Phương pháp thực tế sẽ như sau -
- nếu n =0 thì trả về chuỗi trống, nếu n là 1 thì trả về “0” hoặc khi n là 2 thì trả về “1”
- x:=log n cơ số 2
- nếu 2 ^ (x + 1) - 1 =n, thì
- ans:=chuỗi trống
- tăng x lên 1
- trong khi x không phải 0, thì ans:=nối 0 với ans và tăng x lên 1
- trả lại ans
- thùng rác trả về (n - 2 ^ x + 1, x)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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; }
Đầu vào
23 54
Đầu ra
1000 11001