[LeetCode javaScript] 38. 报数

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

  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
输出: “1”
示例 2:

输入: 4
输出: “1211”

读的方法:
从左向右
如果字符相等,计数器累加,遇到不相同的字符,计数器从一开始
如:1 读作 1个1,2读作 1个2;11111 读作5个1
后一个数是前一个数的读法;
后面的数两个字符为一组,第一个字符表示有几个,第二个表示具体的字符
入1211,有一个“1”,即11,一个2,即12,两个连续的1,即21,连起来整体为111221
(ps:不懂留言,喜欢请点赞支持)

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function(n) {
        //创建cas方法,是为了保持输入输出一致,便于递归调用,其中n为字符串类
        //型,如果使用数字类型,会遇到大数损失精度的问题
       var cas=function(n){
                 if(n=="1"){return "1";}
                 else{
                        //获得前一个的结果
                        var tm=parseInt(n)-1;
                        var ds=cas(tm.toString());
                        //将ds转换为字符串
                        var ps=ds.toString();
                        var mm=[];                        
                        //计数器
                        var count=0;
                        //当前值
                        var current=ps[0];

                        for(var i=0;i<ps.length;i++){
                            if(current==ps[i]){
                                count++;
                            }else{
                                //将对应的读法压入新的数组
                                mm.push(count.toString());
                                mm.push(current);
                                //current=1是因为需要包含当前字符
                                count=1;
                                current=ps[i];
                            }
                        }
                    mm.push(count.toString());
                    mm.push(current);                     
                 return mm.join("");
             }
    }
   return cas(n);
};

猜你喜欢

转载自blog.csdn.net/qq_40547126/article/details/82189064