給定乙個數字,我們按照如下規則把它翻譯為字串:0翻譯成"a",1翻譯成"b",……,11翻譯成"l",……,25翻譯成"z"。乙個數字可能有多個翻譯。例如12258有5種不同的翻譯,它們分別"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" 。請程式設計實現乙個函式用來計算乙個數字有多少種不同的翻譯方法。
刷題刷多了,看到這道題的第一印象是可以用遞迴處理。
我們首先找一下關係式:
用f(i)來表示從第i位開始的不同翻譯數目,可以得到有:f(i)=f(i+1)+g(i,i+1)*f(i+2)。
i和i+1位數字拼起來在10~25範圍內時g(i,i+1)的值為1,否則為0。
因為存在重複的子問題的情況,遞迴並非最佳方法,我們從數字的末尾開始計算f(i),自下而上解決問題,就可以消除重複的子問題了。先算f(len-1),f(len-2),再根據公式f(i)=f(i+1)+g(i,i+1)*f(i+2)往前逐步推導到f(0),這就是最終要求的結果。
count 充當f()
public int gettranslationcount(int number)
string snumber=string.valueof(number);
int len=snumber.length();
int counts=new int[len];
for(int i=len-1;i>=0;i--) else else }}
}return counts[0];
}private boolean canbetrans(string snumber, int i)
劍指Offer對答如流系列 醜數
我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...
劍指Offer對答如流系列 把陣列排成最小的數
輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這3個數字能排成的最小數字321323。之前我們做過字元全排列的習題 劍指offer對答如流系列 字串的排列,但是將演算法思想應用到這一題的話,效果不好,求出所有的組合,再計算出組合的最...
劍指Offer對答如流系列 剪繩子
給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...