1. 题目

题目链接

2. 分析

这题题意不是很好理解,可能需要多读几遍~
题目想说的是:输入一个n值,然后输出外观数列的第n项。那么外观数列是怎么构造的呢?构造方法如下:

  • 外观数列的第一项是1
  • 除了第一项之外,每一项都是对前一项的描述
    例如,外观数列的前五项如下:
1 1
2 11
3 21
4 1211
5 111221

通过上面这个数列,看出只需要通过一个循环判断,然后生成外观数列中的每一项即可。

3.代码

class Solution:
    def countAndSay(self, n: int) -> str:
        # 给定一个正整数 n ,输出外观数列的第 n 项
        # 外观数列是什么呢?  题目中有叙述,其实就是一个递归得到的序列
        
        cnt = 30 # 一直找到30个
        cur = 1
        cnt2arr = {} # 是一个dict. cnt2arr[i] 表示第i项外观数列
        cnt2arr[1] = "1"
        while(cur <= cnt):
            # 接着对上一项的数值进行描述
            cur_des = self.get_desc(cnt2arr[cur])
            print("cur_des",cur_des)
            cur += 1
            cnt2arr[cur] = cur_des
            print(cnt2arr)
        print(cnt2arr)
        return cnt2arr[n]

    # 字符串s 的描述
    def get_desc(self,s):
        print(s)
        cnt = 1 #  表示当前的数值有几个
        pre = s[0] #上一个字符是什么
        idx = 1
        res = ""  # 最后返回的描述性字符串
        while idx < len(s):
            cur = s[idx]
            if pre == cur: # 如果当前的字符和上个字符相同
                cnt += 1
            else:        
                res += (str(cnt) + s[idx-1])
                cnt  = 1 # 重置
            pre = cur # 更新pre
            idx += 1 # 始终要加一
        res += (str(cnt) + s[idx-1])
        return res