题解 | #把数字翻译成字符串#

把数字翻译成字符串

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];
 }

全部评论

相关推荐

11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
11-09 11:01
济南大学 Java
Java抽象带篮子:外卖项目真得美化一下,可以看看我的详细的外卖话术帖子
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务