劍指46 把數字轉化成字串
阿新 • • 發佈:2020-07-05
給定一個數字,我們按照如下規則把它翻譯為字串: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 return1; 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 };