38. 外观数列
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
解释:
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
思路:详见注释。
初始字符串是:“1”,用ans字符串存放结果
遍历字符串,变量tar记录遇到的字符,变量index记录tar出现的次数
————当指针指向的字符与tar相同时,将index自增1;
————当指针指向的字符与tar不同时,将index和tar添加到ans的末尾。
1 class Solution(object): 2 def countAndSay(self, n): 3 """ 4 :type n: int 5 :rtype: str 6 """ 7 # 第一趟结果已知,不参与循环 8 result = "1" 9 n -= 1 10 # 循环n-1趟 11 while n > 0: 12 # 初始化拼接字符串 13 ans = "" 14 # 记录当前字符,初始为原串首字符 15 tar = result[0] 16 # 计数器 17 count = 1 18 # 遍历原串,拼接结果字符串 19 for i in range(1, len(result)): 20 # 指针指向的字符等于记录字符,计数器加1 21 if result[i] == tar: 22 count += 1 23 # 不相等,拼接结果串,并在之后重置记录字符、计数器 24 else: 25 # 字符串拼接 26 ans += str(count) + tar 27 # 重置 28 tar = result[i] 29 count = 1 30 # 字符串拼接 31 ans += str(count) + tar 32 # 重置原字符串 33 result = ans 34 # 循环趟数减1 35 n -= 1 36 return result 37 38 if __name__ == '__main__': 39 solution = Solution() 40 print(solution.countAndSay(1))