力扣 - 剑指 Offer 46. 把数字翻译成字符串
题目
思路1(递归,自顶向下)
这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字符串,每次可以翻译一个或者两个,但是翻译两个的时候还要判断是否为有效的,像
01、02
这种的数字就是无效的,同时超过 25 也是无效的,因此这些不能被翻译。然后我们可以得出状态转移方程:\[dp[i] = \begin{cases} dp[i-1]+dp[i-2] & ,前两个数字组成的结果在10~25之间 \\ dp[i-1] & ,前面两个数字组成的结果是0开头的 \end{cases}
\]
代码
class Solution {
public int translateNum(int num) {
if (num < 10) {
return 1;
}
if (num % 100 >= 10 && num % 100 <= 25) {
return translateNum(num/10) + translateNum(num/100);
} else {
return translateNum(num/10);
}
}
}
复杂度分析
- 时间复杂度:\(O(2^N)\),因为计算过的还是会被递归重复计算的,因此时间复杂度为\(O(2^N)\)
- 空间复杂度:\(O(N)\)
思路2(动态规划)
- 因为递归时间复杂度比较高,因此我们可以采用动态规划来解决这题,动态规划一般都是自底向上,利用 dp 数组存储利用之前计算过的数据。状态转移方程我们已经知道了,因此可以写代码了
代码
class Solution {
public int translateNum(int num) {
String str = String.valueOf(num);
// 使用str.length()+1
int[] dp = new int[str.length()+1];
// 我们只能确定第一位有几种翻译方法
// 真正是从 1 开始,初始化 0 是用来来防止 i-2 出现 -1 的情况
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= str.length(); i++) {
// 如果是两位数的话,需要在10~25之间才有效,否则只能翻译一个数字
if (str.substring(i-2, i).compareTo("10") >= 0 && str.substring(i-2, i).compareTo("25") <= 0) {
dp[i] = dp[i-1] + dp[i-2];
} else {
dp[i] = dp[i-1];
}
}
return dp[str.length()];
}
}
同样我们可以优化下:
class Solution {
public int translateNum(int num) {
String str = String.valueOf(num);
// 我们只能确定第一位有几种翻译方法
int a = 1;
int b = 1;
for (int i = 2; i <= str.length(); i++) {
// 如果是两位数的话,需要在10~25之间才有效,否则只能翻译一个数字
if (str.substring(i-2, i).compareTo("10") >= 0 && str.substring(i-2, i).compareTo("25") <= 0) {
int temp = a + b;
a = b;
b = temp;
} else {
a = b;
}
}
return b;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(1)\)
力扣 - 剑指 Offer 46. 把数字翻译成字符串的更多相关文章
- 剑指 Offer 46. 把数字翻译成字符串 + 动态规划
剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...
- 【Java】 剑指offer(46) 把数字翻译成字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...
- 剑指 Offer 46. 把数字翻译成字符串
题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...
- 每日一题 - 剑指 Offer 46. 把数字翻译成字符串
题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 难易程度:中等 题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ...
- 剑指offer——48把数字翻译成字符串
题目要求: 给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”.一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcf ...
- 剑指offer-面试题46-把数字翻译成字符串-动态规划
/* 题目: 给定一个数字,将0~25依次翻译为a~z,计算有多少种翻译方法. */ /* 思路: 动态规划法 */ #include<iostream> #include<cstr ...
- 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...
- 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...
- 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...
随机推荐
- el-scrollbar滚动条置底
<el-scrollbar ref="leftScrollbar" style="height: 600px"></el-scrollbar& ...
- 初学Python-day13 文件处理1
IO操作 一.os模块 作用:包含了操作系统的基本功能,提供了非常丰富的用来处理文件和目录的函数或方法. 1.属性 函数名 函数说明 name 获取操作系统的类型 uname 获取操作系统的信息(li ...
- the Agiles Scrum Meeting 11
会议时间:2020.4.20 20:00 1.每个人的工作 在这次例会上,我们对上周完成的工作进行了总结. 本周已完成的工作 个人结对项目增量开发组 tq: 创建广播功能 修复纯英文数字可能溢出bug ...
- Prometheus的单机部署
Prometheus的单机部署 一.什么是Prometheus 二.Prometheus的特性 三.支持的指标类型 1.Counter 计数器 2.Gauge 仪表盘 3.Histogram 直方图 ...
- 2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...
- Less3
继续第三关的学习 1.根据第一关的记录,我们判断出是什么注入 id=1' and '1'='1 id=1' and '1'='2 返回不同,所以存在字符型的注入 2. 这时候我们再用正常的报错猜解准备 ...
- CentOS8 部署 MySQL8
前言 有来项目的数据库在此之前使用的是 Docker 部署的,具体可见文章 Docker 安装 MySQL8 ,服务器是阿里云 2C2G 的ECS轻量服务器,可能是配置问题有时不论查什么都要等很长很长 ...
- opencv学习(一)——图像入门
图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...
- Vue面试题2
Class与Style绑定工作有用过吗: 有,后台管理系统菜单.主题色切换 .tab选项卡等..... 计算属性和侦听器区别.使用场景: 计算属性有缓存.并且是响应式依赖缓存,调用不加小括号 利用vu ...
- 关于dns服务工作的原理,和配置的细节理解。
dns服务器相关 1,dns原理,也就是迭代,和递归查询.将域名解析为ip的过程. 一次完整的查询请求经过的流程: Client -->hosts文件 -->DNS Service Loc ...