第 10 天 动态规划(中等)

80 阅读2分钟

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

首先的话,需要将数字转化成字符串的格式的,才可以实现索引

接着的话,需要对其的逻辑进行思考,

比如对于 1 2,如果是这两个数字的话,可以单独看作1和2,也可以看成12

对于1 2 3,如果是这两个数字的话,可以单独看作 12 和 3,也可以看成 1 和 23,然后再对12和23进行上一步骤的运算,

所以我们可以得到对于某个数而言,其当前的数字,从它自身的数字而言的话,其自己的数目会等于上一个对应的数字,而如果其与上一个数字结合后能够符合要求,就是大于等于1,小于等于25的话,就会等于上上一个对应的数字。

用表达式可以表示为 d[i] = d[ i - 1] (这个表示前一个的数目) + d[ i - 2] (这个表示与上一个数字进行结合后,对应前两个的数目)

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

提示:

0 <= num < 231

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number} num
 * @return {number}
 */
var translateNum = function(num) {
// 使用动态规划
// 如果是当前的数目的话,等于上一个数目
// 如果与上一个数可以结合起来的话,等于上上数目
// 两者之和就是当前的数目
    // 对于第一个的话,其最大的数,等于
    // 转化成字符串进行处理
    var number  = String(num)
    var res = [1,1]
    if(number.length == 1)return 1
    for(var i = 1;i < number.length;i++){
        // 当前对应的选择
        var tem = 0;
        var bef =number[i - 1] +  number[i]
        tem = res[i]
        if( bef >= '1' && bef <= '25'){
            tem += res[i - 1]
        }
        res.push(tem)
    }
    return res[res.length - 1]
};

\