题目

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1
2
3
4
5
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
2
输入: 1
输出: "1"

示例 2:

1
2
输入: 4
输出: "1211"

题解

思路

  • 题目意思挺费解的,但是评论区解释得挺清楚了

循环含义

  • 每次外循环含义为给定上一个人报的数,求下一个人报的数
  • 每次内循环为遍历上一个人报的数

具体思路

  • 先设置上一人为’1’
  • 开始外循环
  • 每次外循环先置下一人为空字符串,置待处理的字符num为上一人的第一位,置记录出现的次数为1
  • 开始内循环,遍历上一人的数,如果数是和num一致,则count增加。
  • 若不一致,则将count和num一同添加到next_person报的数中,同时更新num和count
  • 别忘了更新next_person的最后两个数为上一个人最后一个字符以及其出现次数!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def countAndSay(self, n: int) -> str:
prev_person = '1'
for i in range(1,n):
next_person, num, count = '', prev_person[0], 1
for j in range(1,len(prev_person)):
if prev_person[j] == num:count += 1
else:
next_person += str(count) + num
num = prev_person[j]
count = 1
next_person += str(count) + num
prev_person = next_person
return prev_person