leetcode38.外观数列

994 阅读1分钟

38.外观数列

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作 "one 1" ("一个一") , 即 1111 被读作 "two 1s" ("两个一"), 即 2121 被读作 "one 2", "one 1""一个二" , "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。整数序列中的各项表示为一个字符串。

class Solution:  # 递归,即countAndSay(n)处理的是countAndSay(n-1)的结果。
    def countAndSay(self, n: int) -> str:
        if n == 1:  # 如果n=1,返回字符串'1'
            return '1'
        count_num = 0  # 表示重复的字符数
        pre = ''  # 前一位的字符
        strs = ''
        for cur in self.countAndSay(n - 1):
            if cur != pre:  # 如果当前位与前一位不一样,则把前面的字符输出
                if count_num > 0:
                    strs += str(count_num) + pre
                count_num = 1  # 前后不同,count_num自动置1
                pre = cur
            else:  # 如果当前位与前一位一样,那么count_num加一;
                count_num += 1
        strs += str(count_num) + cur  # 最后一位的信息也添加进去
        return strs