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

题目:假定一种编码的编码范围是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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值