本题难度为easy,给了5个字符串,根据规律推测出后续行数的字符,题目要求输入行数返回当行字符。答案里面讲输入行数分成了3类,
1.如果为0返回空字符
2.如果小于等于5直接返回已有字符
3.大于5后开始每行按照规律计算,直到输入行数并返回值
38. Count and Say
Easy
12839542Add to ListShare
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as "one 1"
or 11
.11
is read off as "two 1s"
or 21
.21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1" Explanation: This is the base case.
Example 2:
Input: 4 Output: "1211" Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
origin_list = [[1],[1,1],[2,1],[1,2,1,1],[1,1,1,2,2,1]]
if n == 0 :
return ""
if n<=5:
rtn = ""
for item in origin_list[n-1]:
rtn+=str(item)
return rtn
else:
for i in range(5,n):
last_row = origin_list[i-1]
this_row = []
count = 0
cur_num = last_row[0]
for data in last_row:
if data!=cur_num:
this_row.extend([count,cur_num])
count = 1
cur_num = data
else:
count+=1
this_row.extend([count,cur_num])
origin_list.append(this_row)
rtn = ""
for item in origin_list[-1]:
rtn+=str(item)
return rtn