题解 | #把数字翻译成字符串#
把数字翻译成字符串
https://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668
import java.util.*;
public class Solution {
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
public int solve(String nums) {
int[] numsCount = new int[nums.length()];
// write code here
if (nums.length() == 0) {
return 0;
}
if (nums.length() == 1) {
return nums.equals("0") ? 0 : 1;
}
// 第一个值
StringBuilder sb = new StringBuilder();
char c1 = nums.charAt(0);
char c2 = nums.charAt(1);
sb.append(c1).append(c2);
int num = Integer.parseInt(sb.toString());
if (num == 0 || num <= 9) {
return 0;
} else if (num == 10 || num == 20) { // 比如10 20 30 等只能凑出一个值
numsCount[0] = 1;
numsCount[1] = 1;
} else if (num <= 26) {
numsCount[0] = 1;
numsCount[1] = 2;
} else {
numsCount[0] = 1;
numsCount[1] = 1;
}
for (int i = 2; i < nums.length(); i++) {
sb.setLength(0);
c1 = nums.charAt(i - 1);
c2 = nums.charAt(i);
sb.append(c1).append(c2);
num =Integer.parseInt(sb.toString());
if (num==0){
return 0;
}else if (num<=9){ // 则说明是0开头,并且当前的值只能单独一个值
numsCount[i]=numsCount[i-1];
}else if (num==10 || num==20){ // 比如10 20 30 等只能凑出一个值
numsCount[i]=numsCount[i-2];
}else if (num<=26){
numsCount[i]=numsCount[i-1]+numsCount[i-2];
}else if (num%10==0){
return 0;
}else {
numsCount[i]=numsCount[i-1];
}
}
return numsCount[nums.length() - 1];
}
}
1、先做异常判断
首先我们要知道a->1...z->26
那么如果是0开头是不是一定是为0
2、假设只有2个数字,我们就要判断可能性有多少
(1)如果这2个数字组成以后数字小于9 则说明为0,肯定是0开头的数字,那么肯定没有结果
(2)如果这2个数字组成的结果为10的整倍数(也就是0结尾),那么可能存在10 20 30 40 ,则成立的数一定只有1种可能。只可能是10的整倍数
10的整倍数:10 20 的可能性只有1种
10的整倍数:30 40则不可能有结果
(3)如果凑成的数字为11~26之间,则说明,有2种可能:(1,8)(18)
(4)如果凑成的数字超过26,则说明只能单独成立,则只有1种可能
3、那么通过第2步我们定义一个int[] numsCount = new int[nums.length()];
我们研究一下,一个数字1234
f(2)=3,3这个数字可以和前面的数字凑起来的话满足条件的话,则将原来的数字分隔成(1)(23)...
如果不能凑起来的话,则分割成(...)(3)
发现了吗?
if (num==0){
return 0;
}else if (num<=9){ // 则说明是0开头,并且当前的值只能单独一个值
numsCount[i]=numsCount[i-1];
}else if (num==10 || num==20){ // 比如10 20 30 等只能凑出一个值
numsCount[i]=numsCount[i-2];
}else if (num<=26){
numsCount[i]=numsCount[i-1]+numsCount[i-2]; //他的数量取决于前面的方法有多少种
}else if (num%10==0){
return 0;
}else {
numsCount[i]=numsCount[i-1];
}

