报数

2018-10-07  本文已影响0人  3ni

报数序列是指一个整照其中的整数的顺序进数序列,按行报数,得到下一个数。其前五项如下:

  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(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

上一篇下一篇

猜你喜欢

热点阅读