题解 | #把数字翻译成字符串#
把数字翻译成字符串
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]; }