数列还原
题目描述
有一个数列A[n]
从A[0]
开始每一项都是一个数字
数列中A[n+1]
都是A[n]
的描述
其中A[0]=1
规则如下A[0]:1
A[1]:11
含义其中A[0]=1
是1
个1
即11
表示A[0]
从左到右连续出现了1
次1
A[2]:21
含义其中A[1]=11
是2
个1
即21
表示A[1]
从左到右连续出现了2
次1
A[3]:1211
含义其中A[2]
从左到右是由一个2
和一个1
组成 即1211
表示A[2]
从左到右连续出现了一次2
又连续出现了一次1
A[4]:111221
含义A[3]=1211
从左到右是由一个1
和一个2
两个1
即111221
表示A[3]
从左到右连续出现了一次1
又连续出现了一次2
又连续出现了2
次1
输出第n
项的结果
输入描述
数列第n
项0 <= n <= 59
输出描述
数列内容
示例一
输入
4
输出
111221
代码
# !E:\pythonScript\venv python3
# -*- coding: utf-8 -*-
"""
Date: 2023/3/31
Author: kang
enp:6
"""
import re
n = int(input())
num = [1, 11, 21, 1211, 111221]
k = 4
if n <= 4:
print(num[n])
else:
nlist = "111221"
while k < n:
line = re.findall(r"1+|2+|3+|4+|5+|6+|7+|8+|9+", nlist)
# print(line)
nlist = ""
for i in line:
nlist += (str(len(i)) + i[0])
k = k + 1
print(nlist)
代码解读:(迭代法)
- 第 2 行定义了一个列表 num,其中包含了前 5 个数列中的数字。
- 第 3 行定义了一个整数 k,表示当前已经计算出了 num 列表中的前 k 个数字。
- 第 4~5 行判断如果 n 小于或等于 4,则直接输出 num[n] 的值,即输出 num 列表中的第 n 个数字。
- 第 6 行将初始的数字串 nlist 赋值为 "111221"。
- 第 7~15 行使用 while 循环计算出 num 列表中的第 n 个数字。在每次循环中,使用正则表达式
r"1+|2+|3+|4+|5+|6+|7+|8+|9+"
对 nlist 进行匹配,将匹配结果保存到列表 line 中。 - 第 12~14 行使用 for 循环遍历 line 列表中的每个数字串,将其转换为 "出现次数+数字" 的形式,并将转换后的结果拼接到 nlist 中。
- 第 15 行将 k 的值加 1。
- 第 16 行输出 nlist 的值,即为 num 列表中的第 n 个数字。
- 该代码实现了一个经典的数数问题,即数列中的每个数字都是上一个数字的读法,例如第 2 个数字是 11,是对第 1 个数字 1 的读法;第 3 个数字是 21,是对第 2 个数字 11 的读法;第 4 个数字是 1211,是对第 3 个数字 21 的读法;以此类推。该问题可以使用递归或迭代的方式来解决,
def count_and_say(n: int) -> str:
if n == 1:
return "1"
prev = count_and_say(n - 1)
result = ""
count = 1
for i in range(1, len(prev)):
if prev[i] == prev[i - 1]:
count += 1
else:
result += str(count) + prev[i - 1]
count = 1
result += str(count) + prev[-1]
return result