剑指OfferT46
题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
题目代码
- 方案代码
public static int translateNum(int num) {
String s = Integer.toString(num);
char[] arr = s.toCharArray();
int len = arr.length;
//使用动态规划
//定义:dp[i]:s(0...i)的转化方案数
int[] dp = new int[len];
//初始化
//第一个数只有一种转化方案:0-9均可以转化
dp[0] = 1;
for (int i = 1; i < len; i++) {
dp[i] = dp[i - 1];
int tmp = (arr[i - 1] - '0') * 10 + (arr[i] - '0');
if (tmp >= 10 && tmp <= 25) {
if (i - 2 < 0) {
dp[i]++;
} else {
dp[i] = dp[i - 1]+dp[i - 2];
}
}
}
return dp[len-1];
}
- 完整代码
package com.xiexuanqian.javastudy.jianzhioffer;
import java.util.Scanner;
public class NumToString {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要转化的数字:");
int input = scanner.nextInt();
int res = translateNum(input);
System.out.println(res);
scanner.close();
}
public static int translateNum(int num) {
String s = Integer.toString(num);
char[] arr = s.toCharArray();
int len = arr.length;
//使用动态规划
//定义:dp[i]:s(0...i)的转化方案数
int[] dp = new int[len];
//初始化
//第一个数只有一种转化方案:0-9均可以转化
dp[0] = 1;
for (int i = 1; i < len; i++) {
dp[i] = dp[i - 1];
int tmp = (arr[i - 1] - '0') * 10 + (arr[i] - '0');
if (tmp >= 10 && tmp <= 25) {
if (i - 2 < 0) {
dp[i]++;
} else {
dp[i] = dp[i - 1]+dp[i - 2];
}
}
}
return dp[len-1];
}
}
解题思路
“这题就是有条件的青蛙跳台阶问题”——来自评论区一位大佬的原话,让我醍醐灌顶~ 不过还是建议看一下官方的视频讲解
解题收获
int类型转化为String类型的三种做法
- 字符串拼接==(但该题不建议使用,因为会很慢)==
int a=12345; String ac = ""+a; System.out.println(ac);
- 使用String.valueOf(num)
String ac = String.valueOf(a);
- 使用Integer.toString(num)
String ac = Integer.toString(num);
字符(数字)大小的比较
使用compareTo(“num”)
//tmp = 12258; String tmp = s.substring(i - 2, i); int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a + b : a;
使用ASCII码的加减
//char[] arr = {'1','2','3'}; int acc = arr[i] - '0'; int res = acc>=10 && acc<=25 ? 1:2;
任何字符本身就是数值
String类的compareTo的用法
测试代码
String a = "19"; int b = a.compareTo("25"); String c = "46"; int d = c.compareTo("25"); String e = "33"; int f = e.compareTo("35");
看看该方法的源码
根据源码,可以推导出测试案例的结果为
b=1-2=-1 a=4-2=2 f=3-5=-2
自己想想叭~
做题误区
- 不知道如何找到状态转化方程,以及状态定义,还需要多刷题
- 没有想到这题其实就是有条件的青蛙跳台阶问题,所以刷完题后要多去思考和总结
积极改正,欢迎大家在评论区积极留言呀~