10个数压缩成6个数表示

由0-9表示的数字串,现使其中4个数字不可用,用余下的数字进行重编码。写出编码和解码函数。

前缀编码,前5个剩下的编码用一个数字编码。最后一个以及不可用的4个数字,用两个数字进行编码。

 1 class Coding {
 2     public:
 3         void init(int uncode[], int n) {
 4             // get the code left
 5             vector<int> left;
 6             for (int i = 0, j = 0, m = 0; i < 10; ++i) {
 7                 if (j < 4 && i == uncode[j]) {
 8                     j++;
 9                     continue;
10                 }
11                 left.push_back(i);
12                 if (m < 5) {
13                     string code; code += (left[m++] + ‘0‘);
14                     codebook[i + ‘0‘] = code;
15                     decodebook[code] = i + ‘0‘;
16                 }
17             }
18
19             // code for the last one left
20             string code; code; code += (left.back() + ‘0‘);
21             code += (left.front() + ‘0‘);
22             codebook[left.back() + ‘0‘] = code;
23             decodebook[code] = left.back() + ‘0‘;
24
25             //generate codebook for uncode
26             for (int i = 0; i < 4; ++i) {
27                 string code; code += (left.back() + ‘0‘);
28                 code += (left[i + 1] + ‘0‘);
29                 codebook[uncode[i] + ‘0‘] = code;
30                 decodebook[code] = (uncode[i] + ‘0‘);
31             }
32             //for (map<char, string>::iterator it = codebook.begin(); it != codebook.end(); it++)
33             //  cout << it->first << " " << it->second << endl;
34         }
35
36         string encode(string &str) {
37             if (str.empty()) return "";
38             stringstream ans;
39             for(int i = 0; i < str.length(); ++i) {
40                 ans << codebook[str[i]];
41             }
42             return ans.str();
43         }
44
45         string decode(string &str) {
46             if (str.empty()) return "";
47             stringstream ans;
48             for(int i = 0; i < str.length(); ++i) {
49                 string tmp;
50                 tmp += str[i];
51                 if (decodebook.find(tmp) != decodebook.end() ||
52                         (++i < str.length() && decodebook.find(tmp += str[i]) != decodebook.end())){
53                     ans << decodebook[tmp];
54                 } else {
55                     return "error";
56                 }
57             }
58             return ans.str();
59         }
60     private:
61         map<string, char> decodebook;
62         map<char, string> codebook;
63 };

比如uncode={2,5,8,9},编码表就是这样子的:

 1 0 0
 2 1 1
 3 2 71
 4 3 3
 5 4 4
 6 5 73
 7 6 6
 8 7 70
 9 8 74
10 9 76

7用70来编码。

时间: 2024-10-10 12:52:42

10个数压缩成6个数表示的相关文章

编程题:已知一个一维数组a[10]中有10个数,求出第m个数到第n个数的和。其中m、n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int n,m,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; printf("Please input m and n(m<n<10):\n"); scanf("%d,%d",&m,&am

6 10 18 32 下一个数?编程实现输入任意一个N位置,该数是多少?java实现

6 10 18 32 下一个数?编程实现输入任意一个N位置,该数是多少? 10 = 6 + 4         4 18 = 10 + 8        4 + 4 32 = 18 + 14       8 + 6 ? = 32 + 22       14 + 8 ? = 54 + 32       22 + 10 ? = 86 + 44       32 + 12 分析特点就是 f(x) = f(x-1)+ M; 其中M又是可递归的 4 8 14 22 f(N)=f(N-1)+2*N f(1)

10.4 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 看了下上机指导上的答案,感觉自己写的这段代码有点low. //一个数组一个指针 #include <stdio.h> #define N 10 #define M 3 int b[N]; int * p=b; int main(){ void change(int a[N],int m); int a[N]={1,2,3,4,5,6,7,8,9,0};

10.输入一个数,求这个数的阶乘

(1)运用循环: #include<iostream>using namespace std;int JieCheng(int); int main(){    int n;    cout<<"please input an number: "<<endl;    cin>>n;    cout<<JieCheng(n);} int JieCheng(int n){    int m=1;    for(int i=1;i&

数组a[N],存放了1~N-1个数,其中某个数重复一次【转】

本文转自:http://blog.csdn.net/zhuimengzh/article/details/6720388 数组a[N],存放了1 至N-1 个数,其中某个数重复一次.写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a[],int N) 方法一: [cpp] view plain copy //好算法,因为第二个重复的数字其位置肯定不会变化,而a[a[0]]正好可以访问到每一个位置的数据. int do_dup(int a[],int 

【算法C++】检测数组里是否有两个数之和等于某个数

问题: 检测数组里是否有两个数之和等于某个数 解决方法一:先将数组排序,然后从两头开始遍历 数组排序后,从左端开始取最小值,从右端取最大值, 判断两者之和与目标的大小: 1. 等于时,输出两个数: 2. 大于时,右端移到第2个数,继续判断: 3. 小于时,左端移到第2个数,继续判断. #include <iostream> #include <string> #include <algorithm> using namespace std; void fun1(int

Java求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由用户控制。

System.out.println("请输入1-9之间的数字:"); //提示用户输入1--9之间的数字 Scanner sc=new Scanner(System.in); int shu=sc.nextInt(); //接受用户输入的数字作为题目中的“基数” int a=shu; //定义一个变量a等于用户输入的数. int sum=0; //定义变量作为数字相加的和 System.out.println("请输入相加的个数:"); //提示用户输入需要相加的

hdu 1856 求集合里元素的个数 输出最大的个数是多少

求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL

将n进制的数组压缩成字符串(0-9 a-z)同时解压

此类题目要明确两点: 1. 打表:用数组下标索引字符,同时注意如果从字符对应回数字: int index = (str[i] >= '0' && str[i] <= '9') ? (str[i]-'0'-radix):(str[i]-'a'-radix + 10); 2. 注意低位在前还是高位在前,如果先来的是 低位*radix^i 即可. 3. 统计每几个radix进制数组成一位,利用bits来表示... 这破题主要是麻烦... #include <assert.h&g