Skip to content

Latest commit

 

History

History
61 lines (49 loc) · 1.52 KB

_038.md

File metadata and controls

61 lines (49 loc) · 1.52 KB

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(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]
};