题目描述
思路解析动画文字版
关键动作是分段:把一串数字切成「一段段连续相同的块」,每块念成「几个几」。下面用指针演示怎么扫出这些段。
念 "1" · 起步:从第 1 项 "1" 开始念。cur 指针停在第 0 格,看它指的是什么数字。
念 "1" · 数这一段:高亮的这一段都是数字 1,数一数:只有 1 个。所以这段念作「1 个 1」。
念 "1" · 写下读法:把「个数 1」和「数字 1」依次写下来,就得到第 2 项 "11"。这一段处理完(变灰)。
念 "11" · 起步:现在念第 2 项 "11"。指针 cur 回到最左边,重新从头分段。
念 "11" · 第一格进段:cur 停在第 0 格,数字是 1,先把它收进当前段(高亮一格)。再看右边还是不是 1。
念 "11" · 段还没结束:cur 往右走一格,第 1 格还是 1,和前面同一段,一起算进来——这段连续的 1 一共 2 个。
念 "11" · 写下读法:「2 个 1」写下来就是「2」「1」→ 第 3 项 "21"。注意:是「2个1」念出 21,不是 1+1=2!
念 "21" · 起步:念第 3 项 "21"。cur 回到第 0 格,这串里 2 和 1 不一样,会被切成两段。
念 "21" · 第一段:第一段从 2 开始,右边是 1 不一样,段到此为止——只有 1 个 2。念「1 个 2」。
念 "21" · 写第一段:写下「1」「2」,下一项现在是 "12"。第一段处理完变灰,cur 跳到第二段的开头。
念 "21" · 第二段:cur 来到第二段,数字是 1,后面到头了——这段只有 1 个 1。
念 "21" · 写第二段:再写「1」「1」,接到刚才的 "12" 后面 → 第 4 项 "1211"。两段拼完,整串处理完。
念 "1211" · 起步:念第 4 项 "1211"。这串会切成三段:1 | 2 | 11。cur 从头开始。
念 "1211" · 第一段:第一段:1,右边 2 不一样,段结束 → 1 个 1,写下「1」「1」。下一项 = "11"。
念 "1211" · 第二段:cur 跳到第二段:2,右边 1 不一样 → 1 个 2,写下「1」「2」。下一项变 "1112"。
念 "1211" · 第三段(连续):cur 来到第三段:第 2 格是 1,第 3 格还是 1,连成一段——一共 2 个 1。
念 "1211" · 写第三段:第三段念「2 个 1」→ 写「2」「1」,接到 "1112" 后面 → 第 5 项 "111221"!三段全部处理完。
第 5 项 · 分段验证:反过来验证一下第 5 项 111221:它也能继续被念——前三格连续 3 个 1(高亮),后面 2 个 2、1 个 1。规律一直成立。
回看 · 前 5 项:回头看这条链:每一项都是上一项的读法。绿色这串就是第 5 项 111221——盯住它和上一项 1211 的关系就全懂了。
核心循环:i 标记段的起点,j 往右走到不同字符为止,(j−i) 就是个数,s[i] 就是数字。把这两个写进下一项,i 跳到 j。
雷区实演 · 误当数值算:如果把 "21" 当数值相加得到 3,就彻底错了。它要的是读法:1 个 2、1 个 1 → "1211"。记住:外观 = 念出来。
边界三连:先想最小 n=1(直接返回 "1")、念一次 n=2、再到 n=4,循环边界就稳了。
面试追问:把「只能迭代生成」和「双指针分段」讲清楚,是这题面试的得分点。
参考代码
class Solution: def countAndSay(self, n): s = "1" for _ in range(n - 1): # 从第1项滚到第n项 res = [] i = 0 while i < len(s): j = i while j < len(s) and s[j] == s[i]: # 数同一段 j += 1 res.append(str(j - i)) # 个数 res.append(s[i]) # 数字 i = j # 跳到下一段 s = "".join(res) return s复杂度
- 时间复杂度:O(n · L),外层生成 n 项,每项要扫一遍当前串(长度 L)。串长随项数增长(约 1.3 倍/项),所以总量由最长串主导
- 空间复杂度:O(L),只需保存当前项和正在构建的下一项两个串,L 为最长串长度
易错点
面试追问把动画讲成自己的话
追问为什么不能用公式直接算第 n 项?
追问内层为什么用双指针而不是计数器?
追问能优化时间吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
字符串相乘
LeetCode 43 · 中等 · 沿着 字符串套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题