leetcode(力扣) 38. 外观数列 (过程模拟)
作者:互联网
题目在这:https://leetcode-cn.com/problems/count-and-say/
题目分析:
题目说的很乱,我这里简洁的描述一下。
- 第一个数是1。
- 则第二个数就是描述前一个数,也就是描述第一个数,而第一个数有 1个1,所以第二个数就是 11
- 第三个数描述第二个数,有 2个1 ,所以第三个数就是21
- 第四个数描述第三个数,有 1个2 和 1个1 所以第四个数就是1211。
- 第五个数描述第四个数,是 1个1 1个2 2个1.所以第五个数就是 111221 。
这样说应该明白了吧~~~~
思路分析:
整体思路其实看上面的例子的时候已经出来了。就是无脑循环,每次循环数上一次循环得到的数,设置一个计数器time 初始值为1,如果当前遍历数字和前一个数字不一样,则就是 str(time + 前一个数字) 加入到结果集,然后继续遍历即可。
比如在求第五个数的时候,遍历第四个数,1211 。
- 遍历第一个数是1,第二个数是2,已经与前一个数不同,则答案集就是 str(time + 前一个数) 即 str(1+1) 当前答案集:res = 11。然后重置当前计数器为1。
- 遍历到第三个数,是1 而前一个数是2 ,又不同了,则组合当前的答案集 str(1+2) 答案集: res = 1112
- 遍历到第四个数 与前面一个相等,则计数器加1,且当前为最后一个数了,则 str(2+1) 答案集: 111221
完整代码:
class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return '1'
if n ==2 :
return '11'
time = 1 # 用于当前计数
temp = '11'
res = ''
for _ in range(n-2):
for i in range(0,len(temp)):
if i == len(temp) -1:
if temp[i] == temp[i-1]:
res += str(time)+str(temp[i])
break
if temp[i] == temp[i+1]:
time +=1
else:
res += str(time)+str(temp[i])
time = 1
# 处理最后一个字符
if temp[-1] != temp[-2]:
res += str(1) + str(temp[-1])
temp = res
res = ''
time = 1
return temp
标签:38,temp,res,数是,力扣,遍历,str,time,leetcode 来源: https://blog.csdn.net/qq_38737428/article/details/121343029