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; }