ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

每日一练壹:可执行的算法练习与复盘方法指南

每日一练壹:可执行的算法练习与复盘方法指南 1. 先从标题说起为什么叫“每日一练壹”“每日一练壹”这个标题乍一看很简单拆开无非是“每天”“练习”“壹”。但做练习这件事绝大多数人败就败在“每天”这两个字上。我见过太多人初期热情高涨立下flag结果坚持不到两周就断了。原因倒不是懒而是根本没有建立起一个能对抗“遗忘曲线”和“疲劳期”的练习机制。我把它命名为“壹”有两点考虑。第一代表“只做一件事”每天只练一个核心点不贪多不浅尝辄止。第二代表“从头开始”不管今天是第1天还是第365天每次练习都把自己当作初学者拆解每一个细节。这个思路适用于很多领域但我目前主要实践在编程算法练习上下面分享的具体方法和踩坑经验也偏技术向如果你在练的是其他技能换个皮就能用。这个练习计划适合谁适合那些不知道每天该练什么、练了没效果、坚持不下来的人尤其是准备面试的程序员、刚入行想打基础的新人以及想摆脱“只刷题不总结”状态的进阶选手。我对这套方法的核心要求只有一个可执行。再好的计划如果做不到就是废纸。2. 整体设计思路练习不是堆量是建立反馈回路2.1 一个核心公式练习效果 题量 × 反思深度 × 间隔次数很多人以为“每日一练”等于每天刷一道新题这是一大误区。真正让练习生效的是一个反馈回路投入时间做题 → 发现错误或卡壳 → 分析错因 → 修正认知 → 间隔一定时间后再来一次。我用一个公式来概括练习效果 题量 × 反思深度 × 间隔次数。注意这三个变量是相乘的关系任何一个为0结果就是0。哪怕你每天做十道题但从不回头看错题反思深度可视为0练了等于白练。反过来如果一周只做一道题但反复琢磨、隔几天就重做一遍吸收效率反而可能更高。所以“每日一练壹”的题量要求很低一天一道新题加一道复习题总共两道。新题是探索未知边界复习题是巩固已有认知。记住复习不是简单地再做一遍而是隔两天后重新独立写出解法写不出来就说明上次根本没学会。2.2 为什么不是每天刷五道题初期我也试过“一天五道题”疯狂刷题模式坚持了几天心态崩了。主要原因有三点脑子消化不了。人的工作记忆容量有限一天塞进来太多解法结构第二天就会互相干扰比如混淆二分查找边界条件、忘了滑动窗口的状态更新逻辑。产生心理抵触。每天一想到还有四道题没做完就本能地拖延最后一道都没做。没有复盘时间。五道题做完已经深夜哪还有精力写总结而没有总结的练习就像不过筛子打谷子粮食和糠壳混在一起看似收获大实际留存极少。后来我把目标从“每天五题”换成“每天一道做完、一道复习、一篇总结”效果反而明显提升。面试时机考基本功考察的不是你做过多少题而是你在限时压力下能不能把一道题的思路想清楚、写干净。3. 题目选择与分级策略3.1 三种选题来源按场景灵活切换每天练什么题比练多少题更重要。我按来源把题目分成三类交叉着用来源类型特点使用场景面试高频题库覆盖主流考点题目质量高面试冲刺期按频率降序刷专题分类题库按数据结构/算法分类知识点密集打基础期按专题逐个攻克随机/每日推荐可能遇到陌生题型锻炼临场分析能力保持期防止知识面固化这三种来源对应不同阶段。刚开始学习必须用专题题库因为同一类题连着做你才有机会总结出套路。比如连续做十道“括号匹配”相关的题你才能深刻理解栈的进出栈时机。如果今天一道栈、明天一道动态规划、后天一道图论大概率每道题都做不出来挫败感还会特别强。面试前两到三周主攻高频题每天新题加三道高频重做。我不建议在这个阶段刷冷门题性价比太低。面试官出的题大概率分布在最热门的几十道题里哪怕题目有变体核心思路依然是那些最高频的模型BFS/DFS、双指针、前缀和、动态规划、二分、贪心。3.2 难度曲线的控制技巧我推荐遵循“85%熟悉度 15%挑战”的配比。每天的新题里大部分应该是你垫垫脚就能够到的难度而不是让你完全崩溃的五星难题。判断方式很简单拿到题5分钟只有零散思路但不知道怎么落地 —— 这道题难度刚好。如果5分钟完全没头绪看懂答案都很费劲说明太难先放着等过一两周再回来挑战。连续三次选择过难的题目练习热情会迅速归零。我在实践中总结过一个简单经验如果一道题你第一次做需要看答案才能写出来三天后重做依然需要看答案就说明它超出现有水平太多。不要跟它死磕果断降低难度先把大脑里的基础算法模型建好。能力提升不是靠氧气面罩憋气而是靠每天适度拉伸。4. 每日练习的标准流程五步法4.1 从读题到提交每个环节都有明确动作我给自己规定的流程如下每一步都有产出不会漫无目的地磨时间读题并手写要点2分钟在纸上写下题目类型、输入规模、主要约束条件、输入输出示例。这一步逼你认真看题避免漏掉关键条件。口头讲思路3分钟假装有人在旁边听用自己的话描述解法思路比如“我先排序再用双指针从两端向中间逼近注意到数组里有重复元素要去重”。讲不顺畅的地方就是没想通的地方标出来。写代码15到25分钟严格按讲好的思路写边写边说明每一个关键步骤。不要在没想清楚前就动手敲代码不然二十行以后必然逻辑混乱。运行和检查5分钟先跑示例用例再用边界值测试比如空数组、只有一个元素、全部相同元素、溢出边界值等。复盘提交10分钟写总结记录方法名称、时间空间复杂度、一两个关键记忆点、卡壳原因。步骤3里我特别强调不要提前动代码因为很多犯的错不是语法错误而是步骤拆分混乱。口语梳理思路时你会自然把问题拆分成了几个子步骤代码写起来就是照着顺序填空。动键盘前先想清楚这是解决“改了半天还不知道逻辑错在哪”最有效的手段。4.2 每道题的复盘笔记怎么记复盘笔记的质量直接决定一周后重做时你能吸收多少。我用的格式固定非常简洁题目名称与链接考点标签如哈希表、双指针、区间合并我的首次解法与实际耗时最优解的思路与复杂度对比卡壳点回顾具体到哪一行代码、哪个边界条件没想明白一句话总结规律比如“遇到区间相交问题先按起始位置排序”记录时注意不要大段抄题目解法而是记“从题目到答案的思维链”。比如记录“我没想到可以用前缀和预处理查询区间和”比记录“前缀和公式是 pref[i] pref[i-1] nums[i]”有用得多。前者是思维的缺口后者随时能查资料。5. 核心环节实操一个二分查找的完整复盘案例5.1 我第一天练的题是什么样的拿我练的第一道题举例标准二分查找。给出一个升序数组和一个目标值返回目标值的下标不存在则返回 -1。看起来简单实际有不少隐形陷阱。第一次做时我栽在“循环结束条件”上用的是 left right 还是 left right没想清楚就开写写完调了半天。现在我把这道题拆解一下你可以看看一个系统的练习者是带着什么眼光看一道基础题的边界条件目标值比数组最小值还小或比最大值还大循环结束时 left 和 right 的位置在哪里返回值应该是什么。循环不变量我维护的是“搜索区间”当 left right 时区间为空此时才退出循环。这个认知要内化不是背模板。中间值计算mid left (right - left) / 2写成 (left right) / 2 可能在极端大数下溢出虽然刷题环境一般不会触发但好习惯从开始就养成。5.2 一个二分的模板变体// 找第一个 target 的位置lower_bound 的实现思想 int lowerBound(vectorint nums, int target) { int left 0, right nums.size(); // 注意 right 是开区间 while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { left mid 1; // mid 位置不满足排除掉 } else { right mid; // mid 可能是答案保留右区间 } } return left; // 或 right此时 left right }这个模板的关键在于把条件判断为“排除法”而不是“找到答案”。当前 mid 不满足条件就把这一半删掉满足条件就收紧右边界继续找更靠前的。学会这套思维方式遇到“找第一个坏的版本”“寻找峰值”这类二分变体题时套用排除法就很顺畅。如果只是死记模板题目条件一变就懵。5.3 时间成本核算一天到底投资多少分钟入口寸金难买寸光阴很多人都关心练这个到底耗时多少。我实测的平均值如下环节新手耗时熟练后耗时读题与手写要点3分钟2分钟口头讲思路3分钟2分钟写代码25分钟15分钟运行与边界测试5分钟3分钟复盘笔记10分钟5分钟复习旧题一道10分钟6分钟合计约56分钟约33分钟加上每天那两道题的思考间隙最多不超过1小时完全在大脑耐受范围内。如果你当前基础较弱写代码环节可能超过30分钟那就只做新题复习并入第二天不要硬撑。关键是执行完整流程而不是追求一次完成的数量。6. 实操中遇到的常见问题与排查思路6.1 坚持了两周看不到进步怎么办这是几乎所有人都会经历的阶段我自己也没能幸免。头两周做的题也不少但到了第三周做新题时感觉自己还是“不会”。排查后发现问题出在记忆曲线上的盲区。当时我只做新题没有安排复习第一周做的题到第二周已经大半完了等于做的题都随着记忆流失了。调整方式每周抽三天只做旧题重写。不是凭记忆默写而是像第一次做那样在白纸上画图推导重新跑通逻辑。这一步做完之后到第四周我再看同样的题心虚感明显下降。没有间隔重复的练习就像用破了的水桶打水打多少漏多少。6.2 遇到一道题完全没有思路怎么办这个问题很常见我现在的处理方式是给自己设定“15分钟观察期”而不是和题目死磕。观察期内做的事是列输入输出的关系画几个小例子手动跑一遍问自己三个递进问题这个问题的暴力解法是什么暴力解法里有哪些重复计算能不能用空间换时间把题目跟已学专题对照“这和前缀和有什么关系”“能不能排序后双指针”“是不是可以二分”15分钟一到如果依然没有思路直接看题解。但看题解有讲究不要只看代码先只看思路提示比如“用单调栈维护最近更大元素”合上题解自己写。如果这还写不出来再看代码看完合上纯手写一遍。这跟学弹琴一样看着谱子弹十遍不如背谱弹一遍记忆深刻。6.3 复习旧题时发现完全忘了怎么做正常。忘了恰恰说明当时的复习安排没到位。我碰到这种情形不会自责反而把它当成一次可贵的暴露问题机会。处理方式先不翻题解按新题的流程重推一遍。能推出说明解题肌肉还在推不出就重新做一遍并延长复习间隔安排。整个过程心态要放松练习本来就是螺旋式上升的前一天的“会”可能是假会今天暴露了反而是赚到。6.4 碎片时间怎么用每天的大块时间不够如果你是学生或上班族很难每天都找到完整一小时的整块时间。我的做法是把流程拆成微功能块穿插在碎片时间里。午休花10分钟读题并手写要点下班路上15分钟讲思路晚上回家花25分钟写代码和测试睡前10分钟复盘。只要保证当天完成的是“完整闭环”环节间有间歇没关系。但注意至少写代码和测试两个环节必须在一起中间隔太久思路断了浪费的是自己的时间。6.5 练习平台选择与评测对抗市面上的刷题平台我试过不少最终留下一个主用的和一个备用的。主用的用来做每日练习因为它有每日推荐和题解讨论区解题后能看到别人更简洁的解法复盘时能产生对比促进思考。备用的用来做竞赛周赛因为它社区氛围好偶尔打一场周赛能检验这周的练习成果。评测平台不是越贵越好要选顺手、题目质量高、评论区有干货的。一个平台的题目如果太偏、太怪不值得花时间刷题的主要目的是建立通用能力不是收集稀奇古怪的题目。7. 一些容易忽略但很重要的执行细节7.1 选题库顺序的“先打框架再钻细节”原则前面说不同阶段用不同来源但一个基础原则是先打框架再钻细节。我按这个顺序过专题数组与链表 → 栈与队列 → 哈希表 → 树 → 图 → 排序与搜索 → 动态规划 → 贪心。每个专题不必完全掌握所有的题再进下一个那会拖慢进度。我的建议是每个专题先做够20道经典题能把常见套路讲出来就进入下一个。框架先搭起来后面再做新题时你会发现自己能调用更多已学知识交叉思考的能力也在悄悄长进。7.2 写代码的书写规范与边界测试清单每天练习时的一丢丢好习惯会在以后节省很多时间。我整理了一份自己的边界测试清单空输入或空数组只有一个元素的输入所有元素相同的输入输入已经有序或完全逆序目标值不存在于数据中数值达到题目给定的最大最小值每次提交前对照这些条件在心里或草稿纸上跑一遍能拦截约四成的逻辑错误。不要依赖评测系统的报错尤其是面试场景没有反馈的机会。手写代码之前先用这组边界条件验证自己的思路方向比写完再反复调试高效得多。7.3 休息怎么安排每日一练不等于禁止休息。我的安排是每周练六天留一天完全休息不碰题。持续紧绷跟持续松懈一样有害。每周的休息日实际上让大脑有机会把过去一周的练习巩固下来大脑在睡眠和休息状态下会重放激活过的神经回路。另一件休息日该做的事是浏览一些经典题的题解讨论区不写代码只读思路相当于给下周的练习做个预加载。8. 一些更长远的问题练到什么时候才算练成这个问题我被问过很多次。老实说练成没有绝对标准但我自己心里有一些可测量的信号看到一道中等题能在两分钟内定位考点并给出大体复杂度可接受的解法。高频题里能独立完成率超过八成。写代码时很少因为边界条件或循环条件返工。能在规定时间内把思路完整讲清楚相当于面试状态。达到这四个信号基本说明练习体系已经生效可以进入到“保持期”每周练两三次维持手感即可不必再每天投入一小时。如果目标是顶级大厂面试那需要加大难度和系统性但这是后话。这套练习方法我实际用了大半年从最初每天硬着头皮跑完全流程到后来形成条件反射最大的感受是真正改变人的不是某一天的爆发而是每一天的小推进。把“每日一练”变成一个跟刷牙一样自然的动作回头算总账时那个数字会吓你一跳。最后分享一个小技巧准备一个实体笔记本每练一天就打一个勾连续断了就画一个叉。不要小看这个行为触手可及的视觉反馈比手机App上的打卡更能抵抗放弃的念头。本子上记录清晰就算中断了翻一翻还能找回手感知道自己断在哪、为什么断下次再启动时就不会无从下手。
返回列表