要把 while 和 for 循环练到“炉火纯青”,核心不是背语法,而是把它们变成你解决问题的肌肉记忆。我给你一套可执行的练习路线(含判断标准与题型),你照着做很快会稳。
1. 先明确:什么时候用 while,什么时候用 for
for 更适合:
-
次数固定或可枚举:
for x in iterable - 遍历:列表/字符串/字典/集合、文件行、range
- “做 N 次”
常见:
for i in range(n):
...
for ch in s:
...
for k, v in d.items():
...
while 更适合:
- 条件驱动:不确定做多少次,直到满足条件退出
- “循环直到……”
- 需要
break/continue控制复杂流程 - 模拟迭代过程、双指针、滑动窗口那类
常见:
while cond:
...
判断准则:
- 你先想到“我要遍历每个元素”→ 用
for- 你先想到“我要一直重复直到某条件成立”→ 用
while
2. 练习目标:你必须做到的 6 件事
训练到炉火纯青,通常体现在你能不看教程也能写对:
- 能写出正确的终止条件(避免死循环)
- 能正确使用
break / continue(控制流清晰) - 能处理“边界情况”(空、长度为 1、循环一次的情况)
- 能写出循环中变量更新的正确逻辑(while尤其关键)
- 能把 for/while 互相改写(同样逻辑不同结构)
- 能把循环用于常见题型(见下面题单)
3. 推荐练习路线(最有效)
阶段 A:语法与基础题(1-2 天)
目标:只要会写就行,重点是终止条件和基本遍历。
做题:
- 打印模式(N行星星、倒三角)
- 求和/累乘:
1..n - 统计字符串长度、字符种类
- 用
for遍历列表并输出索引和值 - 用
while实现“输入直到 x 才停止”(终止条件训练)
自检:
- 所有循环都能在合理时间内结束
- 有
while的题你都能明确写出“何时停止”
阶段 B:边界和小坑训练(2-3 天)
目标:你开始在面对“0/1长度、空输入、超界”时不慌。
做题(强烈建议按题型刷):
- 统计:空字符串返回 0
- 反转字符串/列表(注意 i 的范围)
- 判断回文(while 用左右指针)
- “最小/最大值”遍历(初始化要小心)
- 找到第一次满足条件的元素(
break)
自检:
- 你能解释清楚每个下标/范围(例如
range(n)与range(n-1))
阶段 C:把循环用于算法(3-5 天)
目标:从“会写循环”到“能用循环解题”。
重点题型与对应循环风格:
- 双指针(常用 while)
- 回文、合并有序数组、反转区间、最长子串(有时也用滑动窗口 while)
- 滑动窗口/计数窗口(while + 双指针)
- 最长不重复子串
- 找和为 k 的连续子数组(有时 while)
- 遍历 + 计数/映射(for 为主)
- 两数之和(字典)
- 统计词频/字符频率
阶段 D:for/while 互换能力(持续练)
目标:不管怎么写都能写对。
练法:
- 每做一道“遍历题”,你都用 for 写一次,再用 while 改写一次
- 要求:输出完全一致,且复杂度不爆炸
4. 给你一组“循环练习题”清单(照着刷)
你可以从这些题开始(不用全做,选一半也够):
for 类:
- 输出 1…n
- 计算列表中最大/最小
- 字符串中出现次数统计
- 将列表每项平方/过滤条件
- 根据条件筛选元素(列表推导也能反推)
while 类:
- 输入若干整数直到输入 0 停止,统计总和
- while 实现二分/循环查找(先不考虑太多边界也行)
- 用 while 做回文(左右指针)
- 用 while 实现“从 n 倒到 0”
- 用 while 实现简单迷宫/步进模拟(可控)
混合:
- 同时用循环与条件:比如“找出第一个满足条件的索引”
-
break/continue组合题
5. “炉火纯青”的判定标准(你可以对照)
当你做到以下情况,基本就“炉火纯青”了:
- 你写 while 从不忘记更新变量或终止条件(不会死循环)
- 你不需要试错就能写对
range的边界 - 你能自然选择 for/while,不会“硬写”
- 在中等难度题里,循环逻辑能保持清晰可读
6. 我建议你下一步怎么做
你先回答我两个问题,我就能给你定制刷题路径(更快):
- 你现在更常用的是
for还是while?有没有写 while 容易死循环的情况? - 你想主要刷哪类题:字符串、数组、还是算法题(如双指针/滑窗)?
如果你愿意,把你做过的一道 while 题/for 题的代码贴出来,我也可以帮你指出循环写得最关键的坑,并给你同类替练题。