腾讯笔试题——五笔编码

腾讯编程题——五笔编码

假定一种编码的编码范围是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.

问题描述:

问题即使找到输入编码对应的位置

先分析编码的第一位字母:比如 a { aa | aaa aaaa … aaay | aab aaba … aaby | … |aay aaya … aayy| } {ab | aba abaa … abab … abay | abb abba … abby | … |abyy}……. {ay | aya ayaa … ayay| … |ayy ayya … ayyy | } 共有 k*((25+1)*25+1)*25+1个编码

再分析编码的第二位字母:当第一位字母确定时,第二位编码 每换k个字母 如 ab–>ac 一共有 k*((25+1)*25+1)+1 将第一个一位码补上;

分析第三位子的字母: 当第二位的字母确定之后,第三位上,每换一个字母需经过:k*(25+1)+1 将第三位一开始前的两位码补上;

分析第四位:前三位确定好后,第四位即是该个编码在{a,b,c,…,y}中所对应的位置k+1,需要将开头的三位码补上

l = 'abcdefghijklmnopqrstuvwxy'
l = list(l)
## 第一位之前的个数函数
def First(l,char):
    k = l.index(char)
    return k*((26*25+1)*25+1)
## 第一位确定好后,第二位之前的个数函数
def Second(l,char):
    k = l.index(char)
    return k*(26*25+1)+1
## 第一第二位确定好后,第三位之前的个数函数
def Third(l,char):
    k = l.index(char)
    return k*26+1
## 第一,二,三位确定好后,第四位之前的个数函数
def Four(l,char):
    k = l.index(char)
    return k+1
s = input()
s = list(s)
## 由于index从0开始,无需加1
if len(s)==1:
    index = First(l,s[0])  
if len(s)==2:
    index = First(l,s[0])+Second(l,s[1])
if len(s)==3:
    index = First(l,s[0])+Second(l,s[1])+Third(l,s[2])
if len(s)==4:
    index = First(l,s[0])+Second(l,s[1])+Third(l,s[2])+Four(l,s[3])
print(index)    
baca
16331

你可能感兴趣的:(python算法)