• 编码问题


    题目

    有一种编码的编码范围是a~y的25个字母,从1位到4位的编码,从1位到4位的编码,如果把该编码按照字典序排序,形成一个数组如下
    a,aa,aaa,aaab,...b,ba,baa,baaa,baab,...,yyyw,yyyx,yyyy
    其中a的Index为0.要求求某个编码的Index。
    输入:baca
    输出:16331

    分析

    屏幕快照 2016-09-10 下午8.44.11
    如上图,把编码树画出来,确定每一层节点的子树的节点数,逐层往下走,叠加编码串c0c1c2c3中每一个字符ci同级的节点的所有孩子,以及同级的节点即可
    比如编码aaba。
    记result为aaba的位置(从1开始)

    • 对于c0,无兄长节点,因此,只需加上同级节点(节点a),result变为1
    • 对于c1,无兄长节点,因此,只需加上同级节点(节点a),result变为2
    • 对于c2
      • 有一个兄长节点,result加上其孩子数,result = result + 25 = 27
      • 只需加上同级节点,result = result + 2 = 29
    • 对于c3,最后一级,只需加上同级节点。result = result + 1 = 30;

    从1开始数的话,aaba是第30个编码,也就是Index为29.

    源程序

    #include <iostream>
    #include <string>
    #include <math.h>
    
    using namespace std;
    template<typename T>
    void Print(T *data,int len)
    {
        for(int i = 0;i < len;++ i)
            cout << data[i] << ",";
        cout << endl;
    }
    int  Fun(const string& str)
    {
        //subnodes[i]表示下标为i的的字符所在节点对应的子节点数。abcd中c的下标为2.当它作为父节点时,共有25个孩子
        //subnodes = {16275,650,25,0}
        int  subnodes[4] = {0};
        for(int i = 2;i >= 0;-- i)
            subnodes[i] = subnodes[i + 1] * 25 + 25;
        //Print(subnodes,4);
        int len = str.size();
        int result = 0;
        for(int i = 0;i < len;++ i)
        {
            //加上兄长节点的所有孩子
            result += subnodes[i] * (str[i] - 'a');
            //加上兄长节点以及自身
            result += str[i] - 'a' + 1;
        }
        return result - 1;
    }
    
    
    int main()
    {
        string str;
        while(cin >> str)
        {
            if(str.size() > 4)
                break;
            cout << Fun(str) << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    微信小程序实现运动步数排行(可删除)
    微信小程序实现运动步数排行(可删除)
    一个文艺的在线生成漂亮的二维码工具网站
    微信小程序常见的UI框架/组件库总结
    天天快车是款精细的游戏
    MHA的几种死法-叶良辰
    编译maxscale
    mydbtest文档
    高山仰止
    docker居然需要3.10以上的内核
  • 原文地址:https://www.cnblogs.com/rainySue/p/bian-ma-wen-ti.html
Copyright © 2020-2023  润新知