Fork me on GitHub

【Offer】[46] 【把数字翻译成字符串】

题目描述

  给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成“a”,1翻译成“b”,..... 11翻译成“1”,...... 25翻译成“z”。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”“bwfi”、“bczi”、“mcfi”和“mzi”。 请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
  

[牛客网刷题地址]无

思路分析

  1. 我们定义函数f(i)表示从第i位数字开始的不同翻译的数目,那么f(i)=(i+1)+g(i,i+1)*f(i+2)。当第i位和第i+1位两位数字拼接起来的数字在10~ 25的范围内时,函数g(i,i+1)的值为1;否则为0。
  2. 递归从最大的问题开始自上而下解决问题。我们也可以从最小的子问题开始自下而上解决问题,这样就可以消除重复的子问题

测试用例

  1. 功能测试:只有一位数字;包含多位数字。
  2. 特殊输入测试:负数; 0;包含25、26的数字。

Java代码

public class Offer046 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

     public static int GetTranslationCount(int number) {
        return Solution1(number);
    }


    private static int Solution1(int number) {
        if(number<0) {
            return 0;
        }
        String strNum = String.valueOf(number);
        int length = strNum.length();
        int[] count = new int[length];
        for(int i=length-1;i>=0;i--) {
            if(i==length-1) {
                count[i] = 1;
            }else {
                count[i] = count[i+1];
                int a=strNum.charAt(i)-'0';
                int b=strNum.charAt(i+1)-'0';
                int convertNum = a*10+b;
                if(convertNum>=10 && convertNum<=25) {
                    if(i==length-2) {
                        count[i]+=1;
                    }else {
                        count[i]+=count[i+2];
                    }
                }
            }
        }
        return count[0];
    }

    private static void test1() {
        int count = GetTranslationCount(12258);
        System.out.println(count);
    }

    private static void test2() {
        System.out.println(GetTranslationCount(0));
    }
    private static void test3() {
        System.out.println(GetTranslationCount(2526));
    }

}

代码链接

剑指Offer代码-Java

posted @ 2019-08-20 10:01  这个世界~  阅读(110)  评论(0编辑  收藏  举报