一. 题目
- 题目
- 示例
二. 方法一: 递归
-
解题思路
- 递归方法
- 如果n = 1, 直接返回1
- 如果n > 1, 则计算出n - 1项结果
- 对结果进行遍历, 对相邻位置相同数字进行计数
- 然后拼接好的字符串即可
-
解题代码
class Solution: # 递归函数, 貌似写在主函数里面会报错, 不清楚是不是LeetCode不允许主函数递归 def countNum(self, n: int) -> str: # 默认每个元素计数为1 num = 1 result = "" # 如果n = 1, 则结果为1 if n == 1: return "1" # 如果 n > 1, 则获取countNum(n - 1)的结果 else: str1 = self.countNum(n - 1) for i in range(len(str1)): # 遍历到末尾之前, 且当前下标元素和后一个下标元素相等 if i + 1 < len(str1) and str1[i] == str1[i + 1]: # 计数 + 1 num += 1 # 如果遍历到末尾 或者 当前下标元素和后一个下标元素不相等 else: # 将当前的值和当前的数量拼接成字符串 result += str(num) + str1[i] num = 1 return result def countAndSay(self, n: int) -> str: return self.countNum(n)
-
分析
三. 方法二:
-
解题思路
解题思路和方法1差不多, 但是这里使用循环代替了递归
用变量保存了上一次判断的结果 -
解题代码
def countAndSay(self, n: int) -> str: # 第一项的结果为"1" preItem = '1' # 计算下一项 for i in range(1, n): # 初始化 # 将num赋值为1, 下一项设置为空字符串, ele指向前一项的第一个元素 num = 1 nextItem = "" ele = preItem[0] # 遍历前一项的元素 for j in range(1, len(preItem)): # 如果前一项和后一项的值相等, num + 1 if ele == preItem[j]: num += 1 # 如果不相等, 进行字符串的拼接和num的初始化 else: # 将前一个元素的连续个数和值拼接成字符串 nextItem += str(num) + ele # 将当前元素的值赋值给ele, 进行后续的比较 ele = preItem[j] # 初始化num num = 1 # 拼接最后一项 nextItem += str(num) + ele # 将后一项的值,赋值给前一项, 然后再循环 preItem = nextItem return preItem
-
分析
时间复杂度: O(n^2)
空间复杂度: O(n^2)