38. 外观数列
Posted jesseywang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了38. 外观数列相关的知识,希望对你有一定的参考价值。
题目描述: 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
- 迭代:计算出每项的字符串直到第n项,每次都遍历前一项的字符串,计算出新一项的字符串
//JS var countAndSay = function(n) { let preStr = "1", newStr = "", tmp = "", cnt = 0; for(let i = 1; i < n; i++){ //计算每一项的字符串 newStr = ""; tmp = preStr[0]; cnt = 0; for(let j = 0; j < preStr.length; j++){ //生成新一项的字符串 if(tmp == preStr[j]) cnt++; else { newStr += cnt + tmp; tmp = preStr[j]; cnt = 1; } } preStr = newStr + cnt + tmp; } return preStr; };
- 递归:其实就是用递归实现了外层循环
//JS var countAndSay = function(n) { if(n == 1) return "1"; let preStr = countAndSay(n - 1); let dfs = (str) => { let newStr = "", tmp = str[0], cnt = 0; for(let i = 0; i < str.length; i++){ //生成新一项的字符串 if(tmp == str[i]) cnt++; else { newStr += cnt + tmp; tmp = str[i]; cnt = 1; } } str = newStr + cnt + tmp; return str; } return dfs(preStr); };
- 正则替换法:利用正则中1的反向引用,把所有连续的数字都替换
//JS var countAndSay = function(n) { let preStr = "1"; for(let i = 1; i < n; i++){ preStr = preStr.replace(/(d)1*/g, item => `${item.length}${item[0]}`); } return preStr; };
以上是关于38. 外观数列的主要内容,如果未能解决你的问题,请参考以下文章