报数
2018-10-07 本文已影响0人
3ni
报数序列是指一个整照其中的整数的顺序进数序列,按行报数,得到下一个数。其前五项如下:
- 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"
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
if n == 1:
return '1'
nline = '1'
for i in range(1, n):
nline = deal(nline)
return nline
def deal(s):
line = ''
i = 0
while i < len(s):
st = s[i]
n = repeatnums(i, s)
line += (str(n) + st)
i += n
return line
def repeatnums(index, s):
d = s[index]
n = 0
for i in range(index, len(s)):
if d == s[i]:
n += 1
else:
return n
return n
思路:关键是找到规律,从例子来看,单独一个数会变成两个数,一串重复(相邻)的数也会变成两个数,所以遍历字符串时,碰到单独的则转换为2个数字,碰到相邻重复的数,先统计有多少个重复,然后再进行转换。
下面例子为题意理解:
1 为一个一(11)
11为两个一(21)
111为三个一(31)
2为一个二(12)
22为两个二(22)
222为三个二(32)
2222为四个二(42)
12为一个一(11),一个二(12),最后为1112
123为一个一(11),一个二(12),一个三(13),最后为111213
1331为一个一(11),两个三(23),一个一(11),最后为112311