报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: “1”
示例 2:
输入: 4
输出: “1211”
其实就是排列出上一个报数的组合情况,比如4:1211,那么5:111221,我加粗的表示个数
暴力解表,我把所有的情况都添加到ans列表中
首先在ans中添加前两个,然后算出后面所有的数
排名55.89%
ans=['1','11']
for i in range(1,n+1):#我一开始时range(1,30)全部算出来,排名2.78%,hhh
#n+1的话就算到n那一行就好了,没必要算完
c=''#用来表示下一个报数
ss=ans[i]
L=len(ss)
j=0 #用两个指针遍历ss,即上一个报数
k=1
while k<L:
if ss[j]==ss[k]: #如果相同,k+1
k=k+1
if k==L: #如果遍历到上一个报数最后一位
c=c+str(k-j)+ss[j] #表明最后有k-i个ss[j],ss[j]是重复的
ans.append(c)
break
continue #k+1继续遍历
else:
c=c+str(k-j)+ss[j]#这里不是k-j+1,是因为k已经指向
#下一个不一样的数字
j=k #更新指针
k=j+1
if k==L:
c=c+str(k-j)+ss[j] #如果k+1就==L了,表明最后还
#一个ss[j]没添加,加上就结束
#(k-j)不能省略,代表个数的,即使是1
ans.append(c)
break
sss=ans[n-1]
return sss