报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
111221
1 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"), 即 21。 21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1 输出: "1" 示例 2:
输入: 4 输出: "1211"
这题目想了半天没理解什么意思,试了后面几个数后就理解了,其实就是求连续相等的数字,然后计数
比如5:5:111221 => [111, 22, 1] => 31(three one)22(two two)11(one one)
var countAndSay = function(n) {
if (n < 1 || n > 30) {
return ''
}
let arr = ['1', '11', '21', '1211', '111221']
if (n <= 5) {
return arr[n - 1]
}
let numArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
for (let i = 5; i < n; i++) {
let currNum = arr[i - 1]
let currStr = ''
let count = 1
for (let j = 1, len = currNum.length; j <= len; j++) {
if (currNum[j] === currNum[j - 1]) {
count++
} else {
// 当出现不相等的数时,计数之前的数字字符串
currStr += count + '' + numArr[Number(currNum[j - 1]) - 1]
count = 1
}
}
arr.push(currStr)
}
return arr[n - 1]
};