「外观数列」是一个整数序列,从数字 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))