报数序列:
n=1: 1
n=2: 11 # 读做 1个1,记为11;
n=3: 21 # 读作 2个1,记为21;
n=4:1211 # 读作 1个2,1个1,记为1211;
…
现在要求给定一个n(1<=n<=30),输出报数序列的第n项。
一步一步来,分块讲解代码。实质上先统计 个数;在统计 元素。
2.1、n=1情况,返回‘1’即可。 2.2、n=2情况:主要是else部分# -*- coding: utf-8 -*-
'''
题目简述:
报数序列是一个整数序列,按照其中整数顺序进行报数,得到下一个数。
基本思路:
比如: '11' --> 个数:2 ; 数字:1 --> 多做 '21'
'''
class Solution():
def countAndSay(self,n):
if n not in range(1,31): # 检查输入数据范围
return 'the number is out,quit...'
if n == 1: # n=1的特殊情况
return '1'
pointer = 0
rawstr = '1' # 最原始的字符串
countList = [] # 统计个数和元素
while n > 1: #
if pointer+1 < len(rawstr): # 若上一个字符串没有统计完毕
pass
else: # 若统计完毕
countList.append(str(pointer+1)) # 添加个数
countList.append(rawstr[pointer]) # 添加元素
rawstr=''.join(countList) #
countList = []
pointer=0
n-=1
return rawstr
if __name__ == '__main__':
n = 2
solu = Solution()
res = solu.countAndSay(n)
print('结果为\n',res)
2.3、n>2情况:主要是if部分
首先是若两个字符相等情况,指针+1并借助continue跳出循环。
while n > 1: #
if pointer+1 < len(rawstr): # 若上一个字符串没有统计完毕
if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
pointer+=1 #则指针+1,并结束当前循环
else:
pass
continue
若两个字符不等,则直接统计当前元素的个数与元素内容即可。
if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
pointer+=1 #则指针+1,并结束当前循环
else: # 若前后两个不相等
countList.append(str(pointer+1)) # 添加个数
countList.append(rawstr[pointer])# 添加元素
rawstr = rawstr[pointer+1:] # 截取后面字符串
pointer = 0 # 并把指针归0
continue
3、整体代码
# -*- coding: utf-8 -*-
'''
题目简述:
报数序列是一个整数序列,按照其中整数顺序进行报数,得到下一个数。
基本思路:
比如: '11' --> 个数:2 ; 数字:1 --> 多做 '21'
'''
class Solution():
def countAndSay(self,n):
if n not in range(1,31): # 检查输入数据范围
return 'the number is out,quit...'
if n == 1: # n=1的特殊情况
return '1'
pointer = 0
rawstr = '1' # 最原始的字符串
countList = [] # 统计个数和元素
while n > 1: #
if pointer+1 < len(rawstr): # 若上一个字符串没有统计完毕
if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
pointer+=1 #则指针+1,并结束当前循环
else: # 若前后两个不相等
countList.append(str(pointer+1)) # 添加个数
countList.append(rawstr[pointer])# 添加元素
rawstr = rawstr[pointer+1:] # 截取后面字符串
pointer = 0 # 并把指针归0
continue
else: # 若统计完毕
countList.append(str(pointer+1)) # 添加个数
countList.append(rawstr[pointer]) # 添加元素
rawstr=''.join(countList) #
countList = []
pointer=0
n-=1
return rawstr
if __name__ == '__main__':
n = 5
solu = Solution()
res = solu.countAndSay(n)
print('结果为\n',res)
总结
a. 其实不难。