import java.util.ArrayList;
/**
* 面试题46:把数字翻译成字符串
* 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,
* 11 翻译成 “l”,……,25 翻译成 “z”。
* 一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
*
* 示例 1:
* 输入: 12258
* 输出: 5
* 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
* 提示:
* 0 <= num < 2^31
*
* @author
* @create 2021-04-18 20:39
*/
public class Solution46 {
public static void main(String[] args) {
System.out.println(translateNum(12258));
}
/**
* 题目一:输出所有翻译方法的次数
* 动态规划,dp[i]为以第i个数字结尾的当前数字串所拥有的翻译方法数,
* 往前一步,如果第i-1和i-2两个数字组成不小于10且不大于25的数,那么dp[i] = dp[i-1] + dp[i-2]
* 否则dp[i] = dp[i-1];
* @param num
* @return
*/
public static int translateNum(int num){
if (num < 10){
return 1;
}
char[] chars = String.valueOf(num).toCharArray();
int n = chars.length;
int[] dp = new int[n];
dp[0] = 1;//以第一个数字结尾只能有1种翻译方法
//以第二个数字结尾,如果前两个数字>=25,则只有1种翻译方法,否则有两种方法
dp[1] = (chars[0]-'0') * 10 + (chars[1]-'0') <= 25 ? 2 : 1;
for (int i = 2; i < n; i++) {
int t = (chars[i-1]-'0') * 10 + (chars[i]- '0');
if (t <= 25 && t >= 10){
dp[i] = dp[i-1] + dp[i-2];
}else {
dp[i] = dp[i-1];
}
}
return dp[n-1];
}
/**
* 题目二,给出所有可能翻译的次数及对应的翻译
* @param num
* @return
*/
// public static ArrayList<String> res = new ArrayList<>();
// public static ArrayList<String> translate(int num){
// if (num < 10){
// res.add(String.valueOf(num));
// return res;
// }
// return null;
// }
}
【剑指Offer】面试题46:把数字翻译成字符串
最新推荐文章于 2023-12-22 00:15:00 发布