零 题目:算法(leetode,附思维导图 + 全副解法)300题之(38)外观数列

码农三少 ,一个致力于编写极简、但齐全题解(算法)的博主

一 题目形容



二 解法总览(思维导图)

三 全副解法

1 计划1

1)代码:

// 计划1 “相似斐波那切数列,应用2个变量”// 思路:// 1)状态初始化// 2)循环解决 n-1 次,一直解决 pre、now 值// 2.1)依据 pre 值,计算出 now 值// 2.2)将 now值 赋值给 pre 值,now 置为 '',接着进行下一次循环解决 ——> 依据 pre 值,计算出 now 值// 3)返回后果 pre值 var countAndSay = function(n) {    // 1)状态初始化    let pre = '1',        now = '';    // 2)循环解决 n-1 次,一直解决 pre、now 值    for (let i = 0; i < n - 1; i++) {        // 2.1)依据 pre 值,计算出 now 值        const preLength = pre.length;        let count = 1;        for (let j = 0; j < preLength; j++) {            if (pre[j] === pre[j + 1]) {                count++;            }            else {                now += count + '' + pre[j];                count = 1;            }        }        // 2.2)将 now值 赋值给 pre 值,now 置为 '',接着进行下一次循环解决 ——> 依据 pre 值,计算出 now 值        pre = now;        now = '';    }    // 3)返回后果 pre值     return pre;}

2 计划2

1)代码:

// 计划2 “递归 - 普通法”var countAndSay = function(n) {    const dfs = (n) => {        // 1)递归进口        if (n === 1) {            return '1';        }        // 2)递归主体        return dfs(n-1).replace(/(\d)\1*/g, item =>`${item.length}${item[0]}`);    };    return dfs(n);}

3 计划3

1)代码:

// 计划3 “递归 - 简洁法”var countAndSay = function(n) {    if (n === 1) {        return '1';    }        return countAndSay(n-1).replace(/(\d)\1*/g, item =>`${item.length}${item[0]}`);}

4 计划4

1)代码:

// 计划4 “正则 + 循环法”// 思路:// 1)状态初始化// 2)循环解决:一直联合正则匹配状况,应用 replace 函数对 resStr 进行更新// 2.1)注(外围):'111221'.match(/(\d)\1*/g) ,输入 ['111', '22', '1'] // 这样看上面代码就容易很多了, item 顺次为 '111', '22', '1' 。// 3)返回后果 resStr var countAndSay = function(n) {    // 1)状态初始化    let resStr = '1';    // 2)循环解决:一直联合正则匹配状况,应用 replace 函数对 resStr 进行更新    for (let i = 1; i < n; i++){        // 2.1)注(外围):'111221'.match(/(\d)\1*/g) ,输入 ['111', '22', '1']         // 这样看上面代码就容易很多了, item 顺次为 '111', '22', '1' 。        resStr = resStr.replace(/(\d)\1*/g, item =>`${item.length}${item[0]}`);    }    // 3)返回后果 resStr     return resStr;};

5 计划5

1)代码:

// 计划5 “JS装X法:正则 + 递归 --> 1行代码”// 思路:// countAndSay(3) = countAndSay(2).replace(...)//     = countAndSay(1).replace(...).replace(...)//     = 1.replace(...).replace(...).replace(...)var countAndSay = function(n) {    // 注:了解如下正文,代码就很容易了    // countAndSay(3) = countAndSay(2).replace(...)        // = countAndSay(1).replace(...).replace(...)        // = 1.replace(...).replace(...).replace(...)    return n == 1 ? '1' : countAndSay(n-1).replace(/(\d)\1*/g, item =>`${item.length}${item[0]}`);};