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

Posted on 2022-03-13 22:07  AcTourist  阅读(28)  评论(0)    收藏  举报

一、题目

 

二、题目分析

  1.它输入得数据不是数组也不是字符串,所以第一步把输入得数据转换成字符串形式 Let n = num.toString();

  2.这和青蛙的题目相似,为什么这么讲,因为判 字母 只能从 0-25 的数字里翻译出来,所以翻译不会超过三位数,只能再一位数或者二位数里

  3.dp[i]:翻译字符串里的前  i 个的方法

  为什么dp[0]等于1,举个例子 13 ,那 13 就有两种方式:第一种是 1:b,3:d;第二种方式:13:n;刚刚讲的dp是翻译字符串里的前i个的方法,dp[2]说明 13 有翻译两种的方式:2-1=1;两个dp[1]会有矛盾,但又不能超过dp[2],所以这里放一个dp[0]=1;

  4、根据上面的例子判断:一个数字:有两种方式 或者 有一种方式,那我们应该怎么去判断?我们要知道 最大值也就25,超过了就说明没有这个字母,但是也不能低于10,低于说明只有一种方式,不存在两种方式;这样我们有了判断条件,只要我们把当前指针和下一位的指针 的数字组成来判断刚刚的条件,如果有两种方式就:dp[i]=dp[i-1]+dp[i-2];如果一种方式就dp[i]=dp[i-1];

三、代码

/**
 * @param {number} num
 * @return {number}
 */
var translateNum = function(num) {
    let str = num.toString();
    let n = str.length;
    let dp = new Array();

    dp[0] = 1;
    dp[1] = 1;

    for(let i = 2; i<=n; i++){
        const tmp = Number( str[i-2] + str[i-1] );
        if( tmp >= 10 && tmp <= 25){
            dp[i] = dp[i-2] + dp[i-1];
        }else{
            dp[i] = dp[i-1];
        }
    }

    return dp[n];
};