美文网首页
leetcode_p38_countAndSay——js实现

leetcode_p38_countAndSay——js实现

作者: kayleeWei | 来源:发表于2018-07-20 08:59 被阅读0次
    • 题目:报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
    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
        }
    };
    

    相关文章

      网友评论

          本文标题:leetcode_p38_countAndSay——js实现

          本文链接:https://www.haomeiwen.com/subject/yznxmftx.html