1.把数字翻译成字符串
0-25分别表示a-z,给一个数字看有几种翻译方法,例如12258可以翻译为bccfi,bwfi,bczi,mcfi,mzi.
思路:可以想到利用递归解决问题,但递归可能会出现重复计算的问题,为了避免重复计算,我们从右到左进行计算不同翻译的数目。以12258为例,首先计算c4,易见得1;然后计算c3,因为58不符合区间要求,因此c3=1;计算c2,25符合区间要求,因此c2=1+1=2;计算c1,22也符合区间要求,c1=2+1=3;计算c0,12符合要求,c0=3+2=5.
int GetTranslationCount(int number)
{
if(number<0)
{
return 0;
}
string numberInstring=to_string(number);//现将数字转换成字符串
return GetTranslationCount(numberInstring);
}
int GetTranslationCount(const string& number)
{
int length=number.length();
int *counts=new int[length];
int count=0;
for(int i=length-1;i>=0;--i)//从数字末尾开始,从右到左翻译并计算不同翻译的数目
{
count=0;
if(i<length-1)
{
count=counts[i+1];
}
else
{
count=1;//最后一位肯定只有一种选择
}
if(i<length-1)
{
int digit1=number[i]-'0';
int digit2=number[i+1]-'0';
int counverted=digit1*10+digit2;
if(counverted>=10&&counverted<=25)
{
if(i<length-2)
count+=counts[i+2];//如果是倒数第三往左的数,就等于count[i+1]+count[i+2]
else
count+=1;//是倒数第二,只能+1
}
}
counts[i]=count;
}
count=counts[0];
delete[] counts;
return count;
}

京公网安备 11010502036488号