题目及要求:
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1
被读作 "one 1"
("一个一"
) , 即 11
。11
被读作 "two 1s"
("两个一"
), 即 21
。21
被读作 "one 2"
, "one 1"
("一个二"
, "一个一"
) , 即 1211
。
给定一个正整数 n ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
思路:
未看到数据有什么联系,所以看了一下这题的的提示帮助
由上可以看出,序列1的值为初始值,序列2的是为序列1的值的报数,序列3的值为序列2的值的报数,序列4的值为序列3的报数,以此类推。
重新整理的一下思路,我觉得首先应该把报数的规律找出来,然后再去匹配序列,以下代码为第一次尝试。
s="1"
# def countAndSay(n):
n=0
count=0
nums=[]
st=[]
if s.count(s[0])==len(s):
ste = str(s.count(s[0])) + s[0]
st.append(ste)
fina = ''.join(st)
else:
for i in range(1,len(s)):
if s[i]!=s[i-1]:
nums.append(i)
ste=str(nums[0])+s[0]
st.append(ste)
for i in range(1,len(nums)):
ste = str(nums[i]-nums[i-1]) + s[nums[i]-1]
st.append(ste)
if nums[-1] < len(s):
f=len(s)-nums[-1]#最后一个值的个数
ste2=str(f)+s[-1]
st.append(ste2)
fina=''.join(st)
print(fina)
套用报数到序列当中,恩,很难,还没有想到,只能重新再添加一个函数块了。代码如下,虽然这个可以实现效果,但是通不过LeetCode,因为LeetCode只会承认一个函数块,多的函数块是不承认的。
class Solution:
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
# def countAndSay(n):#递归做法
if n==1:
return "1"
s='1'
# fina=sunfa(s)
while n>1:
fina=sunfa(s)
s = fina
n-=1
return str(fina)
def sunfa(s):
# s="1"#起始值
nums = []
st = []
if s.count(s[0]) == len(s):
ste = str(s.count(s[0])) + s[0]
st.append(ste)
fina = ''.join(st)
else:
for i in range(1, len(s)):
if s[i] != s[i - 1]:
nums.append(i)
ste = str(nums[0]) + s[0]
st.append(ste)
for i in range(1, len(nums)):
ste = str(nums[i] - nums[i - 1]) + s[nums[i] - 1]
st.append(ste)
if nums[-1] < len(s):
f = len(s) - nums[-1] # 最后一个值的个数
ste2 = str(f) + s[-1]
st.append(ste2)
fina = ''.join(st)
return fina
所以,我决定换个思路,
-------未完待续--------