【剑指offer】面试题46. 把数字翻译成字符串(java)
发布日期:2021-04-30 21:06:18 浏览次数:119 分类:精选文章

本文共 1575 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要将一个数字翻译成字符串,根据给定的规则:0 翻译成 "a",1 翻译成 "b",依此类推,直到 25 翻译成 "z"。每个数字可能有多个不同的翻译方法,我们需要计算有多少种不同的翻译方法。

方法思路

我们可以使用动态规划来解决这个问题。具体步骤如下:

  • 初始化:我们使用一个数组 dp,其中 dp[i] 表示前 i 位数字的翻译方法数。初始化 dp[0] 为 1,因为空字符串有且只有一种翻译方法。

  • 遍历每一位数字:从左到右遍历数字的每一位,逐步构建可能的翻译方法。

  • 检查有效性:对于每一个可能的分割点 j,检查从 j 到当前位置 i 的数字是否有效(即每一位数字都小于等于 25)。

  • 更新动态规划数组:如果从 ji 的数字有效,则将 dp[i] 加上 dp[j] 的值。

  • 解决代码

    import java.util.ArrayList;
    import java.util.List;
    public class Solution {
    public int translateNum(int num) {
    if (num < 0) return 0;
    if (num < 10) return 1;
    // 保存各个数字
    List
    digits = new ArrayList<>();
    int n = num;
    while (n != 0) {
    digits.add(n % 10);
    n /= 10;
    }
    int k = digits.size();
    int[] dp = new int[k + 1];
    dp[0] = 1;
    for (int i = 1; i <= k; i++) {
    for (int j = 0; j < i; j++) {
    int current = 0;
    boolean valid = true;
    for (int m = j; m < i; m++) {
    current = current * 10 + digits.get(m);
    if (current > 25) {
    valid = false;
    break;
    }
    }
    if (valid) {
    dp[i] += dp[j];
    }
    }
    }
    return dp[k];
    }
    }

    代码解释

  • 初始化处理:首先处理输入的数字,将其拆分成各个数字存储在列表中。
  • 动态规划数组初始化dp 数组的长度为数字的位数加 1,dp[0] 初始化为 1。
  • 遍历每一位:对于每一个位置 i,检查所有可能的分割点 j,从 ji 的数字是否有效。
  • 有效性检查:当从 ji 的数字有效时,将 dp[i] 更新为 dp[j] 的值之和。
  • 这种方法确保了我们考虑了所有可能的分割方式,并且有效性检查保证了每个分割方式都是正确的,从而计算出所有可能的翻译方法数。

    上一篇:【剑指offer】面试题10- II:青蛙跳台阶问题(Java)
    下一篇:css背景样式

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年06月22日 21时19分15秒