- 题目:报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
- 解决思路
-
需要一个最外层的循环,根据输入n的值确定循环次数,循环中包含一个函数,每次循环计算出的值作为下一次的输入:
比如输入4时,需要从1开始,调用函数得到的值,作为下一次调用函数的输入参数,循环3次(因此代码里i=1
从1开始到第3次结束,而非从0开始) -
每次调用的函数中,输入参数为一个数组,如
['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
}
};
网友评论