ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

漫无目的刷算法题:从简单题开始,反而成长更快

漫无目的刷算法题:从简单题开始,反而成长更快 看到这个标题的时候我乐了。这不就是我的日常吗——晚上九点半洗完澡坐电脑前本来只想看一眼明天的天气结果鬼使神差打开算法题库随手点开一道“简单”就开始刷了。没有计划表没有目标清单纯粹是想动脑子的时候就刷两道刷累了就关。就这么“漫无目的”地刷了几个月我发现自己写代码的手感、看问题的思路甚至日常工作的效率都有了实实在在的变化。如果你也是个程序员或者正在准备面试、考研但打开题库就发怵每次都要给自己做足心理建设才开始——这篇文章就是写给你看的。我聊的不是什么“三个月拿下Offer”的硬核攻略而是一套非常不紧绷的刷题方式漫无目的从简单开始怎么让刷题变成一个不需要消耗意志力、甚至有点好玩的习惯以及在这个过程中我怎么意外收获了一套自己的解题方法论。1. 为什么我劝你也试试“漫无目的”地刷1.1 没有目标反而更容易坚持先说个扎心的事实我见过太多人包括我自己在刷题这件事上死在了“制定完美计划”这一步。每个月1号斗志昂扬地下载了一份“30天刷完100道高频题”的表格排得清清楚楚周一数组周二链表周三动态规划。结果呢坚持了四天第五天因为加班没刷第六天觉得断了一天节奏就废了第七天干脆连题库都不开了。完美主义是行动力最大的敌人这句话在刷题上体现得淋漓尽致。而“漫无目的”恰恰治好了这个毛病。今天状态好就刷三道状态差就刷一道甚至刷一道之后发现完全不在状态合上电脑去睡觉也不会有负罪感。因为没有“今天必须完成XX”的KPI在压着你你反而会更容易打开题库。人都是趋利避害的一件事如果总是和心理压力绑定大脑就会自动把它归类为“需要逃避的事”。漫无目的地把刷题变成和刷短视频一样的休闲活动大脑就不会再护着你躲开它了。我记得有段时间我给自己定的规矩特别搞笑每天只要求自己“打开题库页面”。真的就只是打开刷不刷无所谓。但神奇的是只要打开了80%的情况我都会顺手点一道简单题也就十分钟随便写写。结果那个月反而成了我刷题数量最稳定的一个月。1.2 刷题的本质是状态管理不是知识积累很多人理解偏了觉得刷题就是学新知识。动态规划不会那就去学动态规划。图论没接触过那就去啃图论。这种思路不能说错但它忽略了一个更底层的东西刷题首先是一种状态管理你得先让自己处于“能写代码”的状态。这个道理跟健身一模一样。你让一个从不运动的人直接上大重量深蹲他大概率练一次就废了接下来一个月都不想进健身房。但你让他先做做拉伸、快走十分钟身体适应了再慢慢加量反而能长期坚持。漫无目的地从简单题刷起就是在帮你“拉伸和快走”让大脑回忆起读题、想思路、写代码、调试、AC这一整套流程的手感把“刷题”这个过程本身的成本降到最低。我有个特别深的体会长时间不刷题比如过个年之后我连读题都费劲一段描述要看两三遍才明白它在说什么。但只要连续刷三五天简单题那种“题目读两遍就自动开始拆条件”的肌肉记忆就会回来。这种状态远比某个具体的知识点值钱因为它决定的是你能不能把后面学到的东西用出来。1.3 这种刷法适合谁不适合谁先想清楚漫无目的刷题不是万能药它有自己适合的人群和场景。适合的人我觉得主要是这三类。第一类是那种“想刷题但不知道从哪下手”的新手题库一打开几千道题看啥都像天书——俺建议你直接从简单难度列表的第一页开始不用思考。第二类是工作多年、最近突然觉得自己算法能力退化了的在职开发你可能并不打算跳槽但就是想让自己脑子别锈住。第三类是备考周期比较长半年以上的学生时间充裕完全没必要把战线拉得太紧慢慢刷反而积累得更扎实。不太适合的人也很明确离面试只有一两个星期了这时候再漫无目的就是和自己过不去。这种时候你需要的是高强度的专项突击和模拟面试漫无目的帮不了你。所以我的建议是把“漫无目的从简单开始”当作你刷题生活的常态当作每天日常的保留项目真到冲刺期了再切换模式集中火力。2. 从简单开始不是将就是战术选择2.1 简单题的价值被严重低估了我在各种技术群里观察到一个现象很多人刷题有个虚荣心喜欢挑中等难度和困难的题刷觉得简单题是“新手村”的不屑于做。但每次我问他们“你数组的原地修改真的搞明白了吗双指针你清楚它为什么能去重吗”很多人就开始支支吾吾了。这个现象背后其实是对“简单题”的误解。算法题库里的“简单”不代表“没营养”它代表的是算法思路简单、代码实现量少、边界条件少。但恰恰是这些东西构成了算法的地基数组遍历、字符串处理、哈希表的基本用法、链表指针的关系、二叉树的前中后序递归……这些都是你在工程和面试里天天要用的基本功。很多人直接跳去刷中等题然后发现自己不是不会那个“算法”而是连用哈希表处理重复值的套路都没形成肌肉记忆于是每道中等题都写得磕磕绊绊最后只能背答案。这就是典型的没有埋好地基就开始盖楼。我自己有个真实经历。有一段时间我迷上了刷链表题什么反转链表、合并链表、环形链表刷得风生水起。结果某天面试官让我做一道字符串处理的题我居然卡了整整十分钟就因为我不熟悉在Java里用StringBuilder的各种边界细节。那道题论难度最多算中等偏低但长时间不碰字符串的我就是写不顺溜。从那以后我就坚决要求自己简单题里那些看着“笨重”的基础类型必须隔三差五往回刷。2.2 怎么判断一道题“足够简单”每家题库都有自己的难度分级但不同平台的难度标准参差不齐有的平台的“简单”放到另一个平台可能是“中等”。所以我建议你在平台标签之外建立一套自己的判断标准。我的标准有三条全部满足才叫“足够简单”。第一条读完题一分钟之内能大概想到一种解法。哪怕那个解法是暴力遍历都行只要脑子里不是一片空白就行。这个标准确保了题目不会超出你当前的能力上限太多。第二条保守估计半小时之内能写完并通过。注意我说的是保守估计意味着你要把调试时间也算进去。一道如果让你隐隐感觉“今天这题可能得写一个小时还没底”那就果断跳过。第三条这道题的解法思路在以前做过的题里出现过至少一次。换句话说它是已有知识的排列组合而不是全新的知识盲区。这三条标准背后是一个很朴素的学习理论最有效的学习发生在“舒适区边缘”。太简单了无聊太难了劝退只有那种“好像会但又不能秒杀”的题才能同时给你挑战感和成就感。漫无目的不是随便乱刷也是在筛选适合自己当下状态的题。2.3 我的“分类淘汰法”先刷什么后刷什么“从简单开始”还有另一层含义从结构简单的题型开始而不是从表面简单难度的题开始。我自己的亲身教训是新手一上来就碰递归和动态规划的简单题即使标记着“简单”也容易一脸懵。因为这类题难不在代码而在思维方式而思维方式恰恰是需要时间养成的。所以我个人摸索出一套有几个模糊阶段的顺序姑且叫它分类淘汰法吧。第一个阶段优先刷数组和字符串的简单题。这类题几乎没有复杂的数据结构就是遍历、比较、交换你只需要有基本的编码能力就能写。它们是最理想的“找回手感”工具。这一阶段的目的不是学新东西而是让你适应刷题的节奏。第二个阶段开始接触哈希表和双指针。这两类题在简单题里出镜率极高而且它们的解题思路会反复出现在更难的题里——很多中等题本质就是“双指针 哈希表 一点贪心”的组合。熟练这两个武器后面刷题会顺很多。第三个阶段才是二叉树和链表的简单题。这两个数据结构的简单题对代码基本功要求更高尤其是递归。但好在简单题的递归深度通常很浅画一下递归树基本就理解了适合用来建立“递归的直觉”。这不是一个严格的计划表更像一张地图。你不需要按部就班地走只需要心里有一个大概的“先做这个后做那个”的方向然后想到哪做到哪。漫无目的不等于完全随机而是在一个明确的兴趣半径里漫游。3. 一次完整的“漫无目的”刷题实操记录3.1 刷题前的准备环境与心态缺一不可虽然我说漫无目的但基本的准备还是要有的不然打开电脑磨蹭二十分钟连编辑器都没启动也是另一种低效。环境上我会准备三样东西一个可靠的浏览器打开题库页面、一个熟悉的代码编辑器拿来写本地代码跑测试比在线编辑器顺手多了、一个本子纸质的或笔记软件都行用来随手画思路草图。很多人会忽略最后一样但我发现很多简单的题在纸上画两下比在脑子里空想要快得多尤其是在处理数组下标和指针移动这类问题的时候。心态上我给自己定了三条铁律。第一允许自己只刷一道就收工。没人规定打开题库就必须刷够多少题一道也算刷了。第二允许自己看题解。这个尤其重要——我见过太多人把刷题变成了某种“道德考验”好像看了题解就矮人一截。不要这样题解是给你用的不是拿来比的。第三允许自己写到一半换题。如果写了二十分钟还毫无头绪果断放弃换下一道不要有任何内疚感。这三条心态铁律我愿称之为“漫无目的刷题的基石”。没有它们刷题很容易变回那种让人想逃避的苦差事。3.2 现场复盘拿一道经典简单题走一遍完整流程为了让你看清楚“漫无目的”刷题到底是什么样的我拿一道非常经典的简单题完整走一遍。为了读者都能看懂我特意选了最简单的版本题目是这样的给定一个整数数组 nums 和一个整数目标值 target请你在该数组中找出和为目标值 target 的那两个整数并返回它们的数组下标。这道题几乎每个刷题的人都做过但我还是想讲一下我刷它时的完整思考过程因为从这道题里你可以看到一套通用的刷题动作。我拿到题之后做的事是这样的。首先我读一遍题在纸上写下两个关键信息输入是一个数组加一个目标值输出是两个下标。然后我心里默默问自己最暴力的方法是什么答案是一个双重循环外层循环固定一个数内层循环找另一个数相加等于 target 就返回。我直接写出来了代码很短几分钟就写完跑通。这时候很多人就提交收工了但我会再多做一步我继续问自己暴力解法的时间复杂度是多少O(n^2)。空间复杂度呢O(1)。然后我再问能不能优化能。优化思路是自己跟自己对话聊出来的——我有没有用某种方式记住已经看过的东西答案是我可以一边遍历一边把“这个数是谁”和“它的下标在哪”记到一个哈希表里。这样我终于不用回头去逐个找有没有另一个数了我只需要查一下“target 减去当前数”是否已经存在即可。写出来代码大概是这样的def two_sum(nums, target): seen {} for i, num in enumerate(nums): complement target - num if complement in seen: return [seen[complement], i] seen[num] i return []这代码一看就很简洁时间复杂度降到 O(n)。然后我会检查一个容易忽略的边界情况如果数组里有两个相同的数字比如 nums [3, 3]target 6我这个写法有没有问题有。因为第一遍遍历的时候第一个 3 被存进了哈希表第二个 3 进来时发现 target - 3 3 已经存在于哈希表里然后直接返回看起来没问题。但万一这道题要求“不能使用同一个元素”你就得小心了——好在这个最简单的版本约定的是每个输入只对应一个答案所以第一个数字和第二个数字天然是不同位置的元素就算值相同也没关系。这种“提一道题暴力解一遍再优化一遍跑一遍边界”——就是我们说的“完整刷题周期”。漫无目的刷题不是做了提交就完事而是要在简单题上也把这个周期走完。因为很多中等题不是你想不出思路而是你缺了这种“暴力解 → 优化 → 验证边界”的肌肉记忆。3.3 刷完之后三分钟打标签比刷题本身还重要很多人刷题没有“归档”这个概念。刷完一道AC了开心一下关掉页面然后一天之后忘得干干净净。下次遇到类似的题还是不会。这不是脑子的记忆问题是信息没被组织的问题。我自己刷了大概三四十道题之后意识到这个问题的严重性于是给自己设计了一个特别轻量的归档方法每刷完一道题如果这道题有一点值得记住的东西就在笔记软件里给这道题建一个三行的记录。第一行写题目的简单描述一句话概括题在问什么。第二行写解法核心比如“用哈希表存遍历过的数空间换时间”。第三行写刷这道题时的“坑”或者“心得”比如“注意数组越界”“这里特别容易把 left 和 right 写反”。这个归档过程我要求自己不超过三分钟。既不写详细的解题步骤也不整理什么错题本套路。因为一旦把归档变成一件庞大的事下次就不想做了。三分钟足够让你在脑海里对这道题留下一个索引而这个索引会在未来某一天当你遇到一道七八分相似的新题时自动激活。我后来还学会了按主题给这些记录打标签比如“哈希表”“双指针”“区间边界”这种。不需要很严谨能帮你在复习的时候筛出来就行。4. 刷简单题也会翻车常见坑与自救指南4.1 最容易掉的一个坑死磕超时边际收益暴跌漫无目的刷题有个潜在风险一旦你碰到一道“感觉很简单但就是写不对”的题那种“我今天非得搞定它”的执念很容易上头。我就曾经死磕一道所谓的简单题磕了两个多小时最后不是自己写出来的是实在撑不住了去看了题解然后懊恼到睡不着。这个坑的根源在于你把“简单题”和“应该秒掉”划了等号。一旦写不出来就觉得自己被一道简单题羞辱了自尊心被架上了火堆。但你冷静想想一道题标不标“简单”是别人定的跟你当下的状态和基础没有任何关系。可能你就是今天状态不好可能这道题刚好踩了你的知识盲区这不丢人。我的自救方案是“30分钟原则”。从开始读题算起超过30分钟没有实质进展注意是实质进展比如写出了暴力解、想到了一个近似思路都算立刻停手。要么去看题解要么直接换题。为什么要设置30分钟这个阈值因为根据我的经验一道题的思路如果30分钟还没浮现说明你已经在已经掌握的方法里找不到出路了再耗下去只是在原地打转边际收益趋近于零。这时候最好的策略是借助外部输入题解来打破僵局或者干脆把问题放一放让它留在大脑的后台处理。说起来你可能不信我有好几道题是洗澡的时候突然想到思路的——搁置真的是有效果的。4.2 第二个坑看了题解“恍然大悟”第二天原形毕露这是另一个经典场景。一道题卡住你去看题解觉得每一步都很有道理“哦原来要这样”然后你信心满满地关掉题解觉得自己会了。结果第二天让你重新写一遍你甚至想不起来昨天的题说的是什么更别提自己写出来了。这个问题的本质是“我理解了别人的思路”和“我能自己推导这个思路”之间的巨大鸿沟。看题解激活的是你的语言理解能力而做题需要的是你的抽象推理能力和代码组织能力两种能力根本不是一个东西。我的自救方法叫“24小时重写”。看完一道题的题解之后不立刻重写——因为你刚看完脑子里还有刚才的印象写出来等于抄一遍没有训练效果。而是等过24小时之后再打开那道题从头开始自己写就算写得乱七八糟没关系但绝对不能再去看题解。写完再对照题解看看漏掉了哪一步。这个过程我第一次做的时候效果极其惊人。一道我做完“觉得很简单”的题24小时后重写居然卡了二十分钟而且卡在了一个特别蠢的地方——我没有想清楚哈希表里存的到底是“值”还是“下标”。那一刻我才真正明白纸上得来终觉浅这句话在算法刷题里有多真实。4.3 第三个坑遗忘焦虑觉得刷了等于白刷刷到一定数量之后人很容易产生一种“我刷的这些题怎么都忘了”的空虚感。前几天做的题今天看又像新题一样。这种焦虑常常让人萌生“从第一题开始重新刷”的冲动然后陷入一遍一遍从头开始的死循环。我想告诉你遗忘是完全正常的绝大多数刷题的人都会忘你不需要为此感到自责或恐慌。刷题的价值在很多情况下不是“记住某道题的解法”而是“见过某类题的解法模式”。你在反复的刷与忘之间大脑其实已经悄悄留下了模式识别的底子。为了缓解这种焦虑你先别想着对抗遗忘而是接受它然后把对抗遗忘的动作变得足够简单。比如上面说的三分钟打标签就是一个成本极低的对抗遗忘工具。当你在未来某一天刷到一道题隐约觉得“好像在哪见过”的时候查一下你自己的标签记录只需要一句话提示就能把整个解法核心调出来。这就是“降低检索成本”的意义。而当你重复刷到类似题目的时候这也是一种分布式复习——它不靠意志力靠的是模式和巧合。4.4 常见问题速查表我踩过这些你大概率也会踩我把这些年漫无目的刷简单题时遇到的典型问题汇总成了一张表方便你对照自查。问题常见原因我的解决动作打开题库五分钟就关掉启动阻力太大想太多只要求自己打开页面不要求必须刷一道简单题死磕两小时自尊心作祟“简单题必须秒”立下30分钟原则超时果断看题解或换题看题解会合上题解就愣只有语言理解没有推理和编码记忆24小时后重写一遍坚决不看题解昨天做的题今天像新题正常的遗忘机制大脑在做模式整理接受遗忘用三分钟标签建立检索点数组下标总是差一个边界条件没有画图推演在纸上手动模拟几个典型输入特别是空和短的觉得自己不会的太多了想放弃漫无目的缺乏进度感隔两周看一眼自己的标签记录给自己正向反馈总是一看题就想翻题解缺少“自己先想”的时间逼自己先写一个暴力解哪怕很笨再谈优化这些坑几乎每个刷题的人都绕不开。区别在于有些人看到坑就掉进去再也不爬出来了有些人掉进去几次之后学会了绕坑走。希望你少掉几次。5. 刷着刷着方向自然会浮出水面5.1 漫无目的的尽头是你真实的弱点清单很多人担心这样漫无目的地刷会不会刷到最后仍然是“什么都沾一点、什么都不精”。以我自己的经验来回答恰恰不会。恰恰相反漫无目的地刷是一面照妖镜它会以极快的速度把你真实的弱点暴露出来。因为当你没有特定计划的时候你的注意力会自然地流向那些你潜意识里觉得“安全”的领域。这段时间你可能发现你自己刷的题里有70%是数组和哈希表的于是你就在这些领域建立起了极高的熟练度。但同时你会本能地反感某些类型的题比如你发现自己从没主动点开过树结构的题目——哪怕它标着“简单”看了也只想躲。这种“躲”就是最强烈的信号。它告诉你的不是“我不擅长这个”而是“我的舒适区边界在这儿”。一个人要知道自己的边界在哪最直接的办法就是反复试探并观察自己的回避行为。我刷了大概一百来道题之后发现自己的躲闪对象非常清晰递归。看到递归就头疼绕着走。于是我在某一天终于决定直面它专门花了一周时间只刷和递归有关的简单题。这一周之后我没有变成递归大师但至少再看到递归题我敢点进去试一试了。所以说漫无目的本身不是目的它其实是在帮你做自由探索让你花一些时间在大大的领域里游荡直到撞见那些真正值得你深入的方向。5.2 顺手搭一个超轻量“场景-解法”索引在漫无目的刷到七八十题之后你可能会面对一个信息管理上的小烦恼每道题都会了但如果有人问你“你都会些什么样的题”你可能一下子答不上来。这时候你会发现打标签的价值已经从抗遗忘升级到了知识组织。我开始会把第三行“心得”改成更具体的“场景触发词”。比如一道题如果是因为“数组有序”而是用双指针的话我的记录里就会写“看到有序数组 找一对满足条件的数 → 想双指针”。如果是树相关就会写“看到二叉树 需要返回遍历结果 → 想递归还是迭代”。这个“场景-解法”映射的积累过程本质上就是在建立你自己的算法解题套路库。等到你刷到几百道题的时候你会发现自己已经不需要临时去想了很多题看完就能立刻条件反射出思路类别。这种速度感是刷简单题刷出来的不是背难题背出来的。我也试过用一些更复杂的笔记方法做知识管理比如康奈尔笔记法、主题脑图什么的但最后都放弃了。因为维护成本太高很容易让人不想打开笔记软件。反而是这种“一句话场景触发”的极简单格式我坚持了一年多没断。有时候重要的不是笔记体系有多高级而是足够简单到你愿意持续更新。5.3 作为一个常年漫无目的的刷题人我的最后一点心得写了这么多我想最后说点体会。很多人会把“刷题”和“功利”绑定在一起我刷题是为了面试是为了跳槽是为了拿高薪。所以每一次刷题都是一次投资要计算时间的投入产出比要尽量让每一道题都值回票价。我能理解但我不太认同。对我来说“漫无目的”不仅是一种刷题方式更是一种面对学习和成长的心态。人生里真正能让我长期坚持的事情几乎没有一件是从一开始就带着明确的宏大目标的。我开始健身只是因为某天突然想动一动开始写博客只是因为想记录一下工作里碰到的问题开始刷题也只是因为某个晚上觉得脑子需要一点刺激。它们没有一个伴随了“三年规划”或“五步执行方案”但恰恰是这些没有负担的开始让我走得更远。你今天不需要给自己定什么宏大目标不需要写下“一个月刷完一百道题”这种看起来很有气势但几周后就会放弃的计划。你只需要打开题库找到那个叫“简单”的按钮点开第一页第一题开始读第一行字写下你第一行代码。其他的等你刷起来再说。漫无目的从简单开始让一切自然发生。这道题做完我猜你会想再刷一道的。
返回列表