剑指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 };
原文地址:https://www.cnblogs.com/rookiez/p/13245816.html