leetcode初级算法:报数序列,用时44ms,超越98%的用户。
解题思想:
- 因为第n项结果是基于n-1项的,所以先用一个列表list_data存放所有的结果
- 题目的特点是把n-1项的结果读出来(数字个数+数字),形成字符串,作为第n项的结果,那么就用count记录数字个数,把数字放入list_stack中
- 当有一个新数字时,先判断新数字与list_stack[-1]是否相同,如果相同,count+=1,如果不同,将count+数字组成字符串,累加到结果result中
- 按照这种逻辑,依次遍历n-1项的结果,遍历结束后,取出list_stack中的最后一项数字和对应的count,累加到result中,得到n项的结果
- 出于方便按照索引取值,list_data=[‘0’,‘1’],0是拿来占一个索引位置的
- 值得注意的是,当list_stack为空时,表示还没有向列表中添加数据,即还没有对n-1项结果进行遍历,此时应该直接将数字加入list_data中
- 每次完成内部循环时,即遍历完了n-1项结果,都需要重置结果和其他的容器
代码如下
class Solution:
def countAndSay(self, n: int) -> str:
list_data = ['0','1']
if n == 1:
return '1'
for i in range(2,n+1):
list_stack = []
count = 0
data = list_data[i-1]
result = ''
for j in data:
if len(list_stack) == 0:
list_stack.append(j)
count+=1
elif list_stack[-1] == j:
count+=1
elif list_stack[-1] != j:
temp = str(count)+list_stack[-1]
result+=temp
del list_stack[-1]
list_stack.append(j)
count=1
temp = str(count)+list_stack[-1]
result+=temp
list_data.append(result)
return list_data[n]