问题描述

报数序列
n=1: 1
n=2: 11 # 读做 1个1,记为11;
n=3: 21 # 读作 2个1,记为21;
n=4:1211 # 读作 1个2,1个1,记为1211;

现在要求给定一个n(1<=n<=30),输出报数序列的第n项。

1、基本思路

  一步一步来,分块讲解代码。实质上先统计 个数;在统计 元素

2.1、n=1情况,返回‘1’即可。 2.2、n=2情况:主要是else部分
# -*- coding: utf-8 -*-
'''
题目简述:
    报数序列是一个整数序列,按照其中整数顺序进行报数,得到下一个数。
基本思路:
    比如: '11'  --> 个数:2 ; 数字:1  --> 多做 '21'
'''

class Solution():
    def countAndSay(self,n):
        if n not in range(1,31):             # 检查输入数据范围
            return 'the number is out,quit...'
        if n == 1:                           # n=1的特殊情况
            return '1'
        pointer = 0
        rawstr = '1'                         # 最原始的字符串
        countList = []                       # 统计个数和元素

        while n > 1:                         #
            if pointer+1 < len(rawstr):      # 若上一个字符串没有统计完毕
                pass
            else:                            # 若统计完毕
                countList.append(str(pointer+1))  # 添加个数
                countList.append(rawstr[pointer]) # 添加元素
                rawstr=''.join(countList)         #
                countList = []
                pointer=0
            n-=1
        return rawstr
if __name__ == '__main__':
    n = 2
    solu = Solution()
    res = solu.countAndSay(n)
    print('结果为\n',res)
2.3、n>2情况:主要是if部分

首先是若两个字符相等情况,指针+1并借助continue跳出循环。

        while n > 1:                         #
            if pointer+1 < len(rawstr):      # 若上一个字符串没有统计完毕
                if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
                    pointer+=1                           #则指针+1,并结束当前循环
                else:
                    pass
                continue

若两个字符不等,则直接统计当前元素的个数与元素内容即可。

                if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
                    pointer+=1                           #则指针+1,并结束当前循环
                else:                        # 若前后两个不相等
                    countList.append(str(pointer+1)) # 添加个数
                    countList.append(rawstr[pointer])# 添加元素
                    rawstr = rawstr[pointer+1:]      # 截取后面字符串
                    pointer = 0                      # 并把指针归0
                continue
3、整体代码
# -*- coding: utf-8 -*-
'''
题目简述:
    报数序列是一个整数序列,按照其中整数顺序进行报数,得到下一个数。
基本思路:
    比如: '11'  --> 个数:2 ; 数字:1  --> 多做 '21'
'''

class Solution():
    def countAndSay(self,n):
        if n not in range(1,31):             # 检查输入数据范围
            return 'the number is out,quit...'
        if n == 1:                           # n=1的特殊情况
            return '1'
        pointer = 0
        rawstr = '1'                         # 最原始的字符串
        countList = []                       # 统计个数和元素

        while n > 1:                         #
            if pointer+1 < len(rawstr):      # 若上一个字符串没有统计完毕
                if rawstr[pointer] == rawstr[pointer+1]: #若前后两个 字符 相等
                    pointer+=1                           #则指针+1,并结束当前循环
                else:                        # 若前后两个不相等
                    countList.append(str(pointer+1)) # 添加个数
                    countList.append(rawstr[pointer])# 添加元素
                    rawstr = rawstr[pointer+1:]      # 截取后面字符串
                    pointer = 0                      # 并把指针归0
                continue
            else:                            # 若统计完毕
                countList.append(str(pointer+1))  # 添加个数
                countList.append(rawstr[pointer]) # 添加元素
                rawstr=''.join(countList)         #
                countList = []
                pointer=0
            n-=1
        return rawstr
if __name__ == '__main__':
    n = 5
    solu = Solution()
    res = solu.countAndSay(n)
    print('结果为\n',res)
总结

a. 其实不难。