LeetCode-38-报数
in LeetCode with 0 comment

LeetCode-38-报数

in LeetCode with 0 comment

原题地址:报数

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作  "one 1"  ("一个一") , 即 11
11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

示例 1:

输入: 1
输出: "1"

示例 2:

输入: 4
输出: "1211"

解答

根据题目的规则,从第一个数字开始报数即可:

/**
 * @param {number} n
 * @return {string}
 */
const countAndSay1 = function(n) {
    let result = '1';
    for (let i = 1; i < n; i ++) {
        let temp = ''; // 当前的报数结果
        let [count, number] = [1, result[0]]; // 数字及对应的重复数量
        for (let j = 1; j < result.length; j ++) {
            // 数字重复结束,保存到报数结果中,然后重置数字及重复数量
            if (result[j] !== number) {
                temp += `${count}${number}`;
                [count, number] = [1, result[j]];
            } else {
                // 重复数量加1
                count ++;
            }
        }
        // 保存最后一个重复的数字
        temp += `${count}${number}`;
        result = temp;
    }
    return result;
};

测试:

let start = new Date();
const test = countAndSay1;
console.log(test(1)); // 1
console.log(test(4)); // 1211
console.log(new Date().getTime() - start.getTime()); // 8