这几天做了一些关于数字的题,数字组合最小,数字翻译成字符串,数字的二进制运算。下面是其中一道:
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
这道题也不说多难吧,就比较典型,既可以用递归也可以使用动态规划,
看题解:
0-25之内的数字都有对应的字母,这个区间内的数字,都可以进行重组。
大于25或者小于10的数字都只有一种组合。
对于所有的数字,让它模上100,和10比较或者25比较,比10小,就返回1。
比25大,就继续递归;
在以上区间,就返回除以10+除以100的结果;
动态规划和递归思想其实差不太多,就是写法不太一样。
- 递归解法
public static int translateNum(int num) {
if(num<10){
return 1;
}
int res = num%100;
if(res<10||res>=26){
return translateNum(num/10);
}else{
return translateNum(num/10)+translateNum(num/100);
}
}
- 动态规划解法
public static int translateNumWithDp(int num) {
String s = String.valueOf(num);
int[] dp = new int[s.length()+1];
dp[0] = dp[1] = 1;
for (int i=2;i<=s.length();i++){
String str = s.substring(i-2,i);
if (Integer.parseInt(str)>9&&Integer.parseInt(str)<26){
dp[i] = dp[i-1]+dp[i-2];
}else {
dp[i] = dp[i-1];
}
}
return dp[s.length()];
}