Tencent2017秋招笔试题--求编码的index

来源:互联网 发布:网络软文推广公司 编辑:程序博客网 时间:2024/04/30 05:16

题目:假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.

解题:

给定编码,假设为bcde,需要确定字典顺序小于它的共多少个。

1位的,<= b即可,2个;

2位的, 若第1位 < b(只有1个a),第2位有25种选择,若第1位 = b,第2位有 <= c(3)种选择,即共(1*25 + 3)个;

3位的,同理,第1位 < b (一个a),第2位和第3位各25种选择,

第1位 = b,第2位 < c (2),第3位有25种选择,

第1位 = b,第2位 = c,第3位有 <= d (4)种选择,即共(1*25*25+2*25+4)个;

4位的,同理,共(1*25*25*25 + 2*25*25 + 3*25 + 5)个。

可得到bcde的index。

这里要注意,输入的编码可能小于4位,做这样一个处理,比如输入bc,则bc与bcaa的index值差为2,计算出bcaa的index再减去差值即可。


完整C++代码:

#include <iostream>#include <map>#include <string.h>using namespace std; map<char, int> dic {{'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', 4}, {'f', 5}, {'g', 6}, {'h', 7}, {'i', 8}, {'j', 9}, {'k', 10}, {'l', 11}, {'m', 12}, {'n', 13}, {'o', 14}, {'p', 15}, {'q', 16}, {'r', 17}, {'s', 18}, {'t', 19}, {'u', 20}, {'v', 21}, {'w', 22}, {'x', 23}, {'y', 24}}; int fun(char a[4]){    int l = strlen(a);    int index = 0;    switch (l){    case 1:        index = -3;        a[1] = a[2] = a[3] = 'a';        break;     case 2:        index = -2;        a[2] = a[3] = 'a';        break;     case 3:        index = -1;        a[3] = 'a';        break;     default:        index = 0;        break;    }     index = index + dic[a[0]] + dic[a[0]]*25 + dic[a[1]]+1 + dic[a[0]]*625 + dic[a[1]]*25 + dic[a[2]]+1 + dic[a[0]]*625*25 + dic[a[1]]*625 + dic[a[2]]*25 + dic[a[3]]+1;    return index; } int main(){     //auto mi = cbegin(dic);    //cout << mi->first << " " << mi->second << endl;     //for (auto mi : dic)        //cout << mi.first << " " << mi.second << endl;     char a[4];    cin >> a;    //cout <<a << endl;    cout << fun(a) << endl;         return 0;}