1.题目描述
假定一种编码的编码范围是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,如:
输入:baca
输出:16331
2.题目分析
例如:我们来分析一下以字母a开头的排列组合
{
{a,aa,aaa,aaaa,aaab,aaac,...,aaay}
{aab,aaba,aabb,aabc,...,aaby}
{...}
{aay,aaya,aayb,...,aayy}
{ab,aba,abaa,abab,...,abay}
{...}
{ay,aya,ayaa,ayab,...,ayay}
{...}
{ayyy}
}
若首字母为a共有多少种组合:
①a 1种
②a _ 25种
③a _ _ 25x25种
④a _ _ _25x25x25种
若第二个字母为a共有多少种组合:
① _a_ 1种
②_a _ 25种
③_a _ _ 25x25种
若第三个字母为a共有多少种组合:
①_ _a 1种
② _ _a _ 25种
若第四个字母为a共有多少种组合:
① _ _ _a 1种
所以当baca时以b开头时,前面有a开头(b-a)*(1+25+25*25+25*25825),第二位是a,(a-a)*(1+25+25*25)+1(但不能为空),第三位为c,(c-a)*(1+25)+1,第四位为a,(a-a)*(1)+1
baca=(1+25+2525+252525)+1+2x(1+25)+1=16331
3.code
#include<stdio.h>
int CreateIndex(const char* str)
{
if (str == NULL) return -1;
int carry[4] = {
1 + 25 + 25 * 25 + 25 * 25 * 25,
1 + 25 + 25 * 25,
1 + 25,
1
};
int Index = 0;
for (int i = 0; i < 4;++i)
{
if (str[i] >= 'a' && str[i] <= 'y')
{
Index = Index + (str[i] - 'a') * carry[i];
if (i != 0) ++Index;
}
}
return Index;
}
int main()
{
const char* arr = "baca";
int res = CreateIndex(arr);
printf("%d\n", res);
return 0;
}