题2道。。。。算了一道吧

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

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

提示:

0 <= num < 231

方法1 递归
思路

以翻译 2163 为例,它可以分解成两个子问题:翻译 2 和 163 、翻译 21 和 63

每次都有 2 种选择,翻译 1 个数、翻译 2 个数
但有的两位数没有对应的字母,而只能翻译 1 个数,只有 1 种选择
我们画出一个决策树,2 种选择对应了 2 个分支,1 种选择的情况对应 1 个分支
如下图,pointer 从左往右扫描,到达边界或越界,都返回 1 ,标记 △△△ 的分支相当于返回 0 ,是一条死支

题2道。。。。算了一道吧_第1张图片具体实现(把递归讲顺真难啊)

dfs 函数返回:翻译【从 pointer 位置到末尾的数字】的方法数
dfs 维护的状态用 pointer 表示,入口传入 0 ,代表未翻译的状态
dfs 函数参数没有选用子串,是想避免截取字符串消耗性能
dfs 函数中:
如果 pointer 和 pointer + 1 对应的两位数落在 [10, 25] ,说明可以直译
则岔出两个分支:
    翻译 1 个数,pointer 走一步,递归调用 dfs ,返回出剩余数字的翻译方法数
    翻译 2 个数,pointer 走两步,递归调用 dfs ,返回出剩余数字的翻译方法数
    二者相加,就是当前数字串的翻译方法数
如果 pointer 和 pointer + 1 对应的两位数超出 [10, 25],说明无法直译
则只有一个分支
    翻译 1 个数,pointer 走一步,递归调用 dfs ,返回出剩余子串的翻译方法
const translateNum = (num) => {
  const str = num.toString()     
  const dfs = (str, pointer) => {           // 随着dfs向下,pointer右移
    if (pointer >= str.length - 1) return 1 // 指针抵达边界和超出边界都返回1
    const temp = Number(str[pointer] + str[pointer + 1]) // 考察该2位数
    if (temp >= 10 && temp <= 25) {         // 落在[10,25]
      return dfs(str, pointer + 1) + dfs(str, pointer + 2) // 2个分支的结果相加
    } else {                                // 两位数大于25        
      return dfs(str, pointer + 1)          // 返回1个分支的结果
    }
  }
  return dfs(str, 0) // dfs的入口
}

烂方法:

/**
 * @param {number} num
 * @return {number}
 */
var translateNum = function(num) {
    let counter = 1; // 把每位单独为字母的直接加上
    num = num + '';
    let arr = []; // 给一个放复数的容器
    fun(num, counter, arr);
    console.log(counter, arr, '87654323456')
};

const fun = (num, counter, arr) => {
    if (!num.length) return;
    const everyStr = +num[0],
     StrAddOne = +num[1];
     if(everyStr <= 2 && StrAddOne <= 5) {
        counter++;
        if(counter % 2 === 0) arr.push(everyStr * 10 + StrAddOne); // 给数组添加两位数 但互相不耦合 所以counter奇数时候不传
    }
    num = num.substr(1)
    console.log(num, counter, arr, '11111');
    fun(num, counter, arr)
    return [counter, arr]
}

你可能感兴趣的:(题)