增加leetcodeQ46
This commit is contained in:
parent
9a9684458c
commit
b11f2c9c27
78
算法/leetcode/面试题/Q46 把数字翻译成字符串.md
Normal file
78
算法/leetcode/面试题/Q46 把数字翻译成字符串.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
id: "20200609"
|
||||||
|
date: "2020/06/09 17:15"
|
||||||
|
title: "Q46 把数字翻译成字符串"
|
||||||
|
tags: ["java", "leetcode", "动态规划"]
|
||||||
|
categories:
|
||||||
|
- "算法"
|
||||||
|
- "leetcode刷题"
|
||||||
|
---
|
||||||
|
|
||||||
|
题目描述见:[点击跳转](https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/)
|
||||||
|
|
||||||
|
### 解析思路
|
||||||
|
|
||||||
|
  leetcode 中国中的一个中等难度面试题——把数字翻译成字符串,是一个较为简单的动态规划问题(虽然简单我也不会呀)。
|
||||||
|
|
||||||
|
咋一看这个题目描述是懵逼的,思考 10 分钟无果,果断看了解题思路,豁然开朗。
|
||||||
|
|
||||||
|
假设数字的长度为$n$,第$i$个数为$x_i$,长度为$n$的数字结果为$f(n)$
|
||||||
|
|
||||||
|
我们开始找规律:
|
||||||
|
|
||||||
|
- $n=0$时,$f(0)=1$
|
||||||
|
- $n=1$时,$f(1)=1$
|
||||||
|
- $n=2$时,$f(2)=2$
|
||||||
|
- $n=3$,假设前两位是 12
|
||||||
|
<br/>当第三位能和 2 合体时(比如为 5),我们可以把 25 当作一个组合,剩余数字$f(1)$的结果就是此种情况下的结果数。另外一种情况是将 5 作为一个组合,剩余数字$f(2)$的结果为此种情况下的结果数。总的为$f(1)+f(2)$
|
||||||
|
<br/>当第三位不能和第二位合体(比如 8),就只能将 5 作为一个整体,此种情况下的结果为$f(2)$
|
||||||
|
<br/>.
|
||||||
|
<br/>.
|
||||||
|
<br/>.
|
||||||
|
- 依次类推,能得到如下这样一个推导式:
|
||||||
|
|
||||||
|
$$
|
||||||
|
f(n)=\begin{cases}
|
||||||
|
f(n-1)+f(n-2),\quad 10 \le x_nx_{n-1} \le 25 \\\\
|
||||||
|
f(n-1), \quad x_nx_{n-1} <10 \parallel x_nx_{n-1}> 25
|
||||||
|
\end{cases}
|
||||||
|
$$
|
||||||
|
|
||||||
|
思考为什么能得到上面的推导式:
|
||||||
|
|
||||||
|
- 当一串数字 n 加一个数字的时候,如果这个数字不能和前一个数字组成一个整体,那么实际上结果数是不变的,还是$f(n-1)$
|
||||||
|
- 如果能组成那就分成两种情况,将这个数字单独作为一个整体,那么还是和上面一样结果是$f(n-1)$,两外一种是和前一个数字凑成一个整体,这种情况就相当于长度为 n-2 是加上了一个数字,那么结果就是$f(n-2)$
|
||||||
|
|
||||||
|
综合起来就得到了上面的推导公式
|
||||||
|
|
||||||
|
### 代码(Java 实现)
|
||||||
|
|
||||||
|
```java
|
||||||
|
/**
|
||||||
|
* Created with IntelliJ IDEA
|
||||||
|
*
|
||||||
|
* @author fanxb
|
||||||
|
* Date: 2020/6/9 15:10
|
||||||
|
*/
|
||||||
|
public class Q46 {
|
||||||
|
|
||||||
|
public int translateNum(int num) {
|
||||||
|
String str = String.valueOf(num);
|
||||||
|
//a=f(0),b=f(1)
|
||||||
|
int a = 1, b = 1, sum = 1;
|
||||||
|
for (int i = 1, length = str.length(); i < length; i++) {
|
||||||
|
String temp = str.substring(i - 1, i + 1);
|
||||||
|
sum = temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0 ? a + b : b;
|
||||||
|
a = b;
|
||||||
|
b = sum;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println(new Q46().translateNum(12258));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
本文原创发布于:[www.tapme.top/blog/detail/20190806](www.tapme.top/blog/detail/20200609)
|
Loading…
x
Reference in New Issue
Block a user