# 外观数列

即此数列中第n项是对第n-1项的描述,数列的第一项为1. 形如,并以此类推:

序号 当前项 描述
1 1 N/A
2 11 第二项为第一项的描述'1个1'
3 21 第三项为第二项的描述'2个1'
4 1211 第四项为第三项的描述'1个2 1个1'
5 111221 第五项为第四项的描述'1个1 1个2 2个1'

# 1.解题思路

当给出项数n以后,我们需要知道这一项最后会输出什么。就可以直接使用迭代,从第一项推到第n项即可。

# 2.代码实现

/**
 * @description 外观数列
 * 第一项为 1,后一项是对前一项的描述,详细可见百度对外观数列的定义
 * 主要解题思路利用递归描写n-1项,利用正则\1反向引用第一个捕获组内容
 * @param {number} n
 * @return {string}
 */
var countAndSay = function (n) {
    var returnStr = '1';
    for (var count = 2; count <= n; count++) {
        // 利用正则表达式的反向引用,将 '111221' 字符串识别为['111', '22', '1']
        // 从而进入下一次的迭代
        returnStr = returnStr.match(/(\d)\1*/g).reduce(function (init, item) {
            return init + item.length + item[0];
        }, '');
    }
    return returnStr;
};