【剑指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)。
更新动态规划数组:如果从 j 到 i 的数字有效,则将 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,从 j 到 i 的数字是否有效。j 到 i 的数字有效时,将 dp[i] 更新为 dp[j] 的值之和。这种方法确保了我们考虑了所有可能的分割方式,并且有效性检查保证了每个分割方式都是正确的,从而计算出所有可能的翻译方法数。
发表评论
最新留言
表示我来过!
[***.240.166.169]2026年06月22日 21时19分15秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP大数组过滤元素、修改元素性能分析
2023-03-01
PHP大文件切片下载代码
2023-03-01
php如何做表格,新手怎么制作表格
2023-03-01
RabbitMQ集群 - 普通集群搭建、宕机情况
2023-03-01
PHP如何生成唯一的数字ID
2023-03-01
PHP如何获取当前页面的最后修改时间
2023-03-01
PHP如何读取json数据
2023-03-01
PHP字符串
2023-03-01
PHP字符串递增
2023-03-01
php学习之基础语法
2023-03-01
RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
2023-03-01
PHP学习总结(11)——PHP入门篇之WAMPServer多站点配置
2023-03-01
PHP学习总结(12)——PHP入门篇之变量
2023-03-01
PHP学习总结(13)——PHP入门篇之常量
2023-03-01
PHP学习总结(14)——PHP入门篇之常用运算符
2023-03-01
PHP学习总结(1)——PHP入门篇之PHP可以做什么?
2023-03-01
PHP学习总结(2)——PHP入门篇之PHP代码标识
2023-03-01
PHP学习总结(3)——PHP入门篇之PHP的echo语句
2023-03-01
PHP学习总结(4)——PHP入门篇之PHP计算表达式
2023-03-01