FEATURED · 精选文章

元宝 专家 LeetCode 38. 外观数列 Python3实现

发布时间 / 2026/9/2 7:40:39
来源 / 创域科博编辑部
栏目 / 资讯中心
元宝 专家    LeetCode 38. 外观数列 Python3实现 LeetCode 38. 外观数列 — Python3 实现思路外观数列Count and Say的规则n1 →“1”n2 → 读 n1“1” → 1个1 →“11”n3 → 读 n2“11” → 2个1 →“21”n4 → 读 n3“21” → 1个2, 1个1 →“1211”核心操作对上一串字符串做按连续相同字符分组计数然后拼接“count digit”。代码class Solution:def countAndSay(self, n: int) - str:s “1”for _ in range(n - 1):s self._say(s)return sdef _say(self, s: str) - str: result [] i 0 while i len(s): count 1 while i count len(s) and s[i count] s[i]: count 1 result.append(str(count) s[i]) i count return .join(result)双指针分组计数更优雅写法class Solution:def countAndSay(self, n: int) - str:s “1”for _ in range(n - 1):# groupby 天然按连续相同元素分组s “”.join(str(len(list(g))) k for k, g in itertools.groupby(s))return s利用“itertools.groupby” 一行搞定分组非常 Pythonic。关键点要点 说明迭代生成 从“1” 开始逐步生成到第 n 项分组计数 遍历字符串统计连续相同字符的个数时间复杂度 O(n × len)每轮长度约按 1.3 倍增长空间复杂度 O(len)存储当前字符串逐步演示n1: “1”n2: “11” (1个1)n3: “21” (2个1)n4: “1211” (1个2, 1个1)n5: “111221” (1个1, 1个2, 2个1)n6: “312211” (3个1, 2个2, 1个1)手写双指针核心逻辑将 “111221” → “312211”i 0while i len(s):j iwhile j len(s) and s[j] s[i]:j 1# count j - i, digit s[i]result str(j - i) s[i]i j常见陷阱边界条件n1 直接返回“1”循环范围是“range(n-1)”。拼接顺序先“count” 后“digit”不要写反。字符串不可变用“list” 收集再“”“.join()” 比反复“” 更高效。 推荐“itertools.groupby” 版本代码简洁且不易出错。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻