1. 题目
题目链接
2. 分析
这题题意不是很好理解,可能需要多读几遍~
题目想说的是:输入一个n值,然后输出外观数列的第n项。那么外观数列是怎么构造的呢?构造方法如下:
- 外观数列的第一项是1
- 除了第一项之外,每一项都是对前一项的描述
例如,外观数列的前五项如下:
1 1
2 11
3 21
4 1211
5 111221
通过上面这个数列,看出只需要通过一个循环判断,然后生成外观数列中的每一项即可。
3.代码
class Solution:
def countAndSay(self, n: int) -> str:
# 给定一个正整数 n ,输出外观数列的第 n 项
# 外观数列是什么呢? 题目中有叙述,其实就是一个递归得到的序列
cnt = 30 # 一直找到30个
cur = 1
cnt2arr = {} # 是一个dict. cnt2arr[i] 表示第i项外观数列
cnt2arr[1] = "1"
while(cur <= cnt):
# 接着对上一项的数值进行描述
cur_des = self.get_desc(cnt2arr[cur])
print("cur_des",cur_des)
cur += 1
cnt2arr[cur] = cur_des
print(cnt2arr)
print(cnt2arr)
return cnt2arr[n]
# 字符串s 的描述
def get_desc(self,s):
print(s)
cnt = 1 # 表示当前的数值有几个
pre = s[0] #上一个字符是什么
idx = 1
res = "" # 最后返回的描述性字符串
while idx < len(s):
cur = s[idx]
if pre == cur: # 如果当前的字符和上个字符相同
cnt += 1
else:
res += (str(cnt) + s[idx-1])
cnt = 1 # 重置
pre = cur # 更新pre
idx += 1 # 始终要加一
res += (str(cnt) + s[idx-1])
return res