leetcode_p38_countAndSay——js实现

2018-07-20  本文已影响0人  kayleeWei
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 ,输出报数序列的第 n 项。

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

输入: 1
输出: "1"

输入: 4
输出: "1211"

  1. 需要一个最外层的循环,根据输入n的值确定循环次数,循环中包含一个函数,每次循环计算出的值作为下一次的输入:
    比如输入4时,需要从1开始,调用函数得到的值,作为下一次调用函数的输入参数,循环3次(因此代码里i=1从1开始到第3次结束,而非从0开始)

  2. 每次调用的函数中,输入参数为一个数组,如['1','2','1','1'],使用两个指针记录连续字符串的始末位置(一开始都在同一个起点,如果数组前后两个值相等,就把endIdx向后移动一位)。连续字符的个数为endIdx - startIdx。最后把“读”数的结果放入nextArr,移动startIdx到endInx的位置,进行下一个字符是否连续的判断。

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function(n) {
    var a = ['1'];
    for (var i = 1; i < n; i++) {
        a = preStr(a)
    }
    return a.join('')

    function preStr(a) {
        let startIdx = 0
        let endIdx = 0
        let nextArr = []
        while (endIdx < a.length) {
        // for(let i = 0; i < a.length; ++i) {
            while(a[startIdx] === a[endIdx]) {
                endIdx++
            }
            let num = endIdx - startIdx
            nextArr.push(num.toString())
            nextArr.push(a[startIdx])
            startIdx = endIdx
        }
        return nextArr
    }
};
上一篇下一篇

猜你喜欢

热点阅读