题目来源:
https://leetcode.com/problems/count-and-say/description/
题目分析:
首先,题目告诉我们count and say是这样的序列:
1. 1
2. 11
3. 21
4. 1211
5. 111221
它是这样计算的,比如第一个数是1,则第二个数是个数加上数字,也就是一个1,所以是11;同理,第三个数字是第二个数字从左往右的个数加上数字,则为2个1,所以是21;第四个数字是第三个数字从左往右的个数加上数字,则第三个数字里面的2表示为1个2,第三个数字里的1表示为1个1,所以第四个数字为1211...以此类推。现在题目给一个整数n,要我们输出此时的count and say序列。因为要求n=5时,需要知道n=4的序列,而n=4的序列是由于n=3的序列来求出...由此我们可以想到先定义一个函数,使它输入一个字符串时,可以得到它的下一个字符串,然后在主函数中循环n次即可。需要注意的是,题目要求该整数序列用字符串表示。
解题代码:
class Solution:
def countstr(self,s):
count=0;tmp=s[0];x=""
for i in range(len(s)):
if(s[i]==tmp):%此时的比较是前后2个数字进行比较看它们是否相等
count=count+1
else:
x+=str(count)+tmp
tmp=s[i];count=1
x+=str(count) + tmp %%循环后之所以要加一个是指最后一个数字
return x
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
ans='1'%起始从'1'开始
while(n>1):
ans=self.countstr(ans)
n-=1
return ans
同样的思路,写在一个函数里,则是双重循环。
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
s = '1'
for i in range(n-1):
count = 1
temp = []
for index in range(1, len(s)):
if s[index] == s[index-1]:
count += 1
else:
temp.append(str(count))
temp.append(s[index-1])
count = 1
temp.append(str(count))
temp.append(s[-1])
s = ''.join(temp) %%该函数用于连接字符串
return s
还可以递归来进行运算:
class Solution(object):
def countAndSay(self, n):
if n == 1: return "1"
s = self.countAndSay(n-1)
i, ch, tmp = 0, s[0], ''
for j in range(1, len(s)):
if s[j] != ch:
tmp += str(j-i) + ch
i, ch = j, s[j]
tmp += str(len(s)-i) + ch
return tmp