题目描述:
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
代码实现:
1 def countAndSay(n): 2 ''' 3 4 :param n: 5 :return: 6 ''' 7 cur_num = 11 # 表示当前数 8 # 输出第n个数,因从首项为11,所以循环遍历n-2次得到第n个数 9 for i in range(n-2): 10 right = 0 # 向右循环遍历 11 res = [] # 统计上一个数中数字个数,用来表示下一个数 12 cur_num = str(cur_num) 13 # 统计数中各字符个数 14 while right < len(cur_num) - 1: 15 # 统计字符个数 16 temp_right = right 17 count = 1 18 count1 = 1 19 # 判断相邻元素是否相等 20 while temp_right < len(cur_num) - 1 and cur_num[temp_right] == cur_num[temp_right + 1]: 21 count1 += 1 22 temp_right += 1 23 24 if temp_right == right: # right没发生变化,相邻元素不相等 25 temp1 = [count, int(cur_num[right])] 26 res.append(temp1) 27 right += 1 28 else: # right发生了变化,相邻元素相等 29 temp = [count1, int(cur_num[temp_right])] 30 res.append(temp) 31 right += count1 32 33 # 因最后一位可能没判断到,所以需要进一步判断最后一位 34 if cur_num[-1] != cur_num[-2]: # 最后一位没判断到 35 temp2 = [1, int(cur_num[-1])] 36 res.append(temp2) 37 # else: # 最后一位判断到了,什么也不用做 38 # continue 39 40 cur_num = sum(res, []) 41 num = "" 42 for i in cur_num: 43 num += str(i) 44 cur_num = int(num) 45 print(cur_num) 46 # cur_num=int(num+str(i) for i in cur_num) 47 return str(cur_num) if n != 1 else "1" 48 49 50 print("----------测试countAndSay---------") 51 res = countAndSay(7) 52 print("res=", res)
输出:
21
1211
111221
312211
13112221
res= 13112221
总结:本题花费了大量时间来实现,真是费心费力,呵累!!!其思想就是怎么去统计一串字符串中连续相同元素个数,当然相邻元素不相同时个数就是1。