返回

技术专家解读:解剖 LeetCode 38. 外观数列,探索背后的奥秘

前端

前言

LeetCode 38. 外观数列是一道经典题目,不仅考察了算法技巧,还涉及数学和字符串操作。它要求我们生成一个序列,其中每个数字代表前一个数字出现的次数。例如,111221 表示:1 出现一次,1 出现两次,2 出现一次。

解题方法

1. 递归方法

递归方法以简洁明了著称,它将问题分解为更小的子问题。以下是递归方法的步骤:

  • 基础情况: 如果输入的字符串为空,则返回空字符串。
  • 递归调用: 对于非空字符串,创建一个新字符串,并迭代原始字符串。
  • 计数: 记录当前字符出现的次数。
  • 追加: 将字符和计数添加到新字符串中。
  • 递归: 使用原始字符串的剩余部分递归调用该函数。

2. 迭代方法

迭代方法通过使用循环逐个字符地遍历字符串。以下是迭代方法的步骤:

  • 初始化: 创建两个变量,count 用于计数,result 用于存储结果。
  • 遍历: 迭代原始字符串,对于每个字符:
    • 如果当前字符与上一个字符不同,则重置 count
    • 增加 count
    • 将字符和计数添加到 result 中。
  • 返回: 返回 result

代码示例

递归方法:

def countAndSay(n):
    if n == 0:
        return ""
    result = ""
    count = 1
    prev = n[0]
    for i in range(1, len(n)):
        if n[i] == prev:
            count += 1
        else:
            result += str(count) + prev
            count = 1
            prev = n[i]
    result += str(count) + prev
    return result

迭代方法:

def countAndSay(n):
    count = 1
    result = ""
    for i in range(len(n)):
        if i < len(n) - 1 and n[i] == n[i+1]:
            count += 1
        else:
            result += str(count) + n[i]
            count = 1
    return result

总结

LeetCode 38. 外观数列是一道经典题目,可以通过递归或迭代方法解决。这道题不仅考察了算法技巧,还涉及数学和字符串操作。希望这篇文章能够帮助你更好地理解这道题,并为解决更复杂的问题做好准备。