zoukankan      html  css  js  c++  java
  • 算法入门经典-第四章 例题4-4 信息解码

    编写一个解码程序,对数字串进行解码。

    输入第一行是一个解码key。key从左到右每个字符分别对0,00,01,10,000,001,011,100,101,110,0000,0001,...,1101,1110,00000,.......不存在全是1的key。

    长度为len的字符编码有2^n-1个,而且恰好以二进制方式从0到2^n-2递增,而且字符编码的最大长度为7,可以有2^7-1=127个字符。

    需要解码的文本由多个小节组成,每个小节的前三个数字代表小节中每个编码的长度(用二进制表示,例如010表示2),然后是该长度的不定个字符编码,以全1结束,如长度为2时 '11'就表示结束,长度为000时表示需要编码的文本结束。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>   
    using namespace std;
    int code[8][1<<8];//按位压缩 = code[8][256]; 
    int readchar() 
    {
        for(;;)
        {
            int a = getchar();
            if(a != '
    '&&a != '
    ')  //一直读到非换行符才返回  
            return a;
        }
    }
    int readint(int n)
    {
        int v = 0;
        while(n--)
        v = v*2+readchar()-'0';//读入二进制 
        return v;
    }
    void printcodes()//辅助调试 
    { 
        for (int len = 1;len <= 7;len++) 
        { 
            for (int i = 0;i < (1 << len) - 1;i++) 
            { 
                if (code[len][i] == 0) return; 
                printf("code[%d][%d]=%c
    ", len, i, code[len][i]); 
            } 
        } 
    } 
    int readcode()
    {
          printcodes();  
        memset(code,0,sizeof(code));
        ////举例 如0 00 01 10…… 对应abcd   
        code[1][0] = readchar();//直接调到第二行开始读取,如果输入已经结束,会读到EOF 
        for(int len = 2;len <= 7;len++)//因为是二进制,所以刚好开成二维数组,第一个是字符长度,第二个是十进制大小 
        {
            for(int i = 0;i < (1<<len)-1;i++)//每次刚好是存2的len次方-1 
            {
                int a = getchar();
                if(a == EOF)
                return 0;//结束输入 
                if(a == '
    '||a == '
    ')
                return 1;//继续while循环 
                code[len][i] = a;//把对应位置的字符放到二维数组里 
            }
        }
        return 1;
    }
    int main() 
    {
        while(readcode())//无法读取更多编码头时退出 
        {
            for(;;)
            {
                int len = 0;
                len = readint(3);//读01串长度 
                if(len == 0)//000结束 
                break;
                for(;;)
                {
                    int a = 0;
                    a = readint(len); //len=2 010      1000 111
                    if(a == ((1<<len)-1))//全1结束这一串 
                    break;
                    putchar(code[len][a]);
                }
            }
            cout << endl;
        }
        return 0;
    }

    我觉得这道题考察了对二进制读取,转化,因为存进去的都是01串,要考虑如何转为十进制,而且编码可能有多行组成,还要考虑换行符,由于是二进制,存的顺序也是按二进制,数组开成二维,第一个是编码长度,第二个是编码的十进制大小。 
    这里对编码的读入,判断,和存储利用了readint和readcode来实现。

     

    补充:

    getchar有一个int型的返回值。当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。
    当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符
    回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,
    而直接读取缓冲区中的字符。直到缓冲区中的字符读完为后,才等待用户按键。
  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/is-Tina/p/7424935.html
Copyright © 2011-2022 走看看