剑指46 把数字转化成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
一看就符合递归的思路,但是这题和斐波那契一样,递归都会导致反复求解重复的子问题。这种问题应该采用自底向上的循环方法。
对于每个位置,如果他和下一个数组合起来可以被翻译为字符,那么从这个数往后的部分可以翻译的方法ans[n]=ans[n+1]+ans[n+2]
注意判断的时候,一般会采用计算n和n+1的组成的数字的值是否大于25来判断,但是注意当num[n]为0的时候,和也会小于25,但是不能被组合起来翻译。
1 class Solution { 2 public: 3 int translateNum(int num) { 4 if(num<0) 5 return 0; 6 if(num<10) 7 return 1; 8 int len=0,origin=num; 9 while(num!=0){ 10 len++; 11 num/=10; 12 } 13 char chnum[len+1]; 14 sprintf(chnum,"%d",origin); 15 int ans[len+1]; 16 ans[len-1]=1; 17 if(chnum[len-2]!='0') 18 ans[len-2]=(chnum[len-2]-'0')*10+(chnum[len-1]-'0')>25?1:2; 19 else 20 ans[len-2]=ans[len-1]; 21 cout<<len<<endl; 22 for(int index=len-3;index>=0;index--){ 23 if(chnum[index]=='0'){ 24 ans[index]=ans[index+1]; 25 continue; 26 } 27 ans[index]=(chnum[index]-'0')*10+(chnum[index+1]-'0')>25?ans[index+1]:ans[index+1]+ans[index+2]; 28 } 29 return ans[0]; 30 31 } 32 };