报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1
11
21
1211
111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
dbq我刚开始都没看懂题目(哭
1
11
21
1211
111221
312211
……
1 1 :第一行中有1个1
2 1 :第二行中有2个1
1 2 1 1 :第三行中有1个2 和 1个1
1 1 1 2 2 1 :第四行有1个1 1个2 2个1
3 1 2 2 1 1 :第五行中有3个1 2个2 1个1
……
我刚开始哈、还想着用数组。。。
让他都生成一回。。最后返回下标为n-1的字符串就行
但其实,,不怎么现实,,而且也很复杂
完了在重复那判断的时候吧、我居然还想着搞一个for循环,让他匹配1-9出现自然数的个数……其实完全没必要
因为我刚开始想着把他们每个都放在数组里
数组的每个元素都是一个string类型的
我倒是想到了去遍历这每一个string
完了我还在想我要用数组下标又要用字符串元素自己的下标
……
越想越麻烦
唯独最开始想到的一点就是
计算它出现的次数+当前数字
……反之做完之后觉得初始想法太蠢了
比如说我要知道第2个人他报数内容是什么
那我描述的应该是第1个人的数字顺序
第一个人它默认是1
假设我是第二个人
那我在报数的时候,就要看第一个人是啥
第一个人的内容里默认只有“1”
所以我得看看里面有几个1
嗷只有1个1,所以我报数内容为“1 1”
现在继续假设
我是第三个人了
我就要看第二个人的内容是什么==》“1 1”
我在报数的时候,我就发现第二个人它的内容里面有2个1
嗷那我就是报“2 1”
所以说主要我就得去遍历前面一个人它报的内容
我还得看它有没有重复的数字,没有的话就是1呗(所以我设置初始值为1)
如果有的话我还得算算那个数字重复了几次
function CountAndSay(n) {
var Str="1";
var TempStr='';
for(var i=1;i<n;i++) {//控制次数
//因为是要描述前面一个的数字
//所以次数得n-1
var j = 0;
while (j < Str.length) {//对当前的Str做遍历
var num = 1;//初始化数量为1
while (Str[j] === Str[j + 1] && (j + 1) < Str.length) {//如果有重复的话
num++;//累加重复的个数
j++;//继续看后面的是不是也重复
}
TempStr = TempStr + num + Str[j];//如果没有重复,num就为1
j++;//如果没有重复也要继续判断后面的
}
Str=TempStr;//更新Str
TempStr='';
}
return Str;
}
主要他就是CoutAndSay
Cout:计算它重复了几次
Say:有重复的话说重复了几次和哪个数字、没重复的话就说那个数字重复了一次
最后用“+”连接起来就行