剑指Offer对答如流系列 - 把数字翻译成字符串

Posted jefferychenxiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer对答如流系列 - 把数字翻译成字符串相关的知识,希望对你有一定的参考价值。

面试题46:把数字翻译成字符串

题目描述

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

问题分析

刷题刷多了,看到这道题的第一印象是可以用递归处理。

我们首先找一下关系式:

用f(i)来表示从第i位开始的不同翻译数目,可以得到有:**f(i)=f(i+1)+g(i,i+1)*f(i+2)**。

i和i+1位数字拼起来在10~25范围内时g(i,i+1)的值为1,否则为0。

因为存在重复的子问题的情况,递归并非最佳方法,我们从数字的末尾开始计算f(i),自下而上解决问题,就可以消除重复的子问题了。先算f(len-1),f(len-2),再根据公式f(i)=f(i+1)+g(i,i+1)*f(i+2)往前逐步推导到f(0),这就是最终要求的结果。

问题解决

count[] 充当f()

 public int getTranslationCount(int number) {
        if(number<0) {
            return 0;
        }
        String sNumber=String.valueOf(number);
        int len=sNumber.length();

        int[] counts=new int[len];
        for(int i=len-1;i>=0;i--) {
            if(i==len-1) {
                counts[i]=1;
            } else {
                counts[i]=counts[i+1];
                if(canBeTrans(sNumber,i)) {
                    if(i==len-2) {
                        counts[i]+=1;
                    } else {
                        counts[i]+=counts[i+2];
                    }
                }
            }
        }
        return counts[0];
    }

    private boolean canBeTrans(String sNumber, int i) {
        int a=sNumber.charAt(i)-'0';
        int b=sNumber.charAt(i+1)-'0';
        int convert=a*10+b;
        return convert >= 10 && convert <= 25;
    }

以上是关于剑指Offer对答如流系列 - 把数字翻译成字符串的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer对答如流系列 - 把数组排成最小的数

算法剑指 Offer 46. 把数字翻译成字符串

剑指offer:把数字翻译成字符串

剑指Offer对答如流系列 - 数字序列中某一位的数字

剑指offer 把数字翻译成字符串

剑指offer——48把数字翻译成字符串