报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
- 1
- 11
- 21
- 1211
- 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);
};