我有个朋友,Java后端干了八年,上周面某大厂,前面三轮项目聊得风生水起,第四轮手撕算法,一道中等难度的链表环检测题,卡了快四十分钟,最后悻悻而归。他在朋友圈骂了一晚上算法题,底下评论区吵成一锅粥:有人说是大厂筛人的遮羞布,有人说是程序员基本功的试金石,还有人直接甩出一句“你要是不会刷题就别去大厂”。这件事特别典型——程序员对算法题面试的态度,几乎可以按阵营划分:校招生觉得卷但认命,社招老油条觉得侮辱智商,面试官觉得这是成本最低的过滤器。今天就把这问题掰开聊透:到底该不该面、校招社招怎么区分、怎么准备才不吃亏。
1. 算法题面试的争议本质:一边骂一边考,图的是什么
1.1 公司视角:算法题筛的是“最省成本的智商标尺”
先替公司的角度说两句公道话。一家大厂秋招,简历池里躺着十来万份简历,面试官时间就那么多,必须用一种低成本、高区分度、还相对不容易造假的筛选方式。算法题几乎完美契合这个需求:题目是统一的,答案有公认的复杂度标准,几十分钟聊下来,候选人的数据结构功底、逻辑链完整性、写代码的习惯、甚至承压状态都能看个七八成。
这跟健身房的体测一个道理——体测成绩好不代表你跑马拉松厉害,但它能最快地把不合适的人筛出去。算法题要的就是这个“筛”字,而不是“选”字。很多候选人吐槽,说面试考的动态规划日常根本用不上。这话没毛病,但站在面试官角度,他一天面五个人,每个人都说自己做过的项目很牛,怎么横向比较?总不能五个人都把自己公司的业务代码搬来现场评吧。一套统一的算法题,至少保证了比较的公平性。
1.2 候选人视角:反感的核心是“不匹配”
再说候选人为什么反感。反感的核心不是“题难”,而是“不匹配”。一个写了八年CRUD、对业务和架构熟得不能再熟的人,你的优势全在工程经验上,然后面试官让你现场手写一个红黑树的删除操作,你什么感觉?你会觉得自己被降维评价了,前面八年的积累在这一刻全部归零,大家被丢回同一条起跑线重新比记忆力。
更伤人的是有些公司“面试造火箭,工作拧螺丝”,算法面得难上天,进去之后天天写增删改查。这种错位感积累多了,“算法题就是八股文”的骂名就传开了。还有一种隐蔽的不公平:算法题和应试能力高度相关,工作三五年的老程序员早就忘了大学里那些dp转移方程,你让他临时捡起来,他当然不乐意。但这种不乐意,恰恰说明了一个事实——考前突击确实能应付一部分算法面试,这也让更多人质疑它到底在考什么。
1.3 真正的错位:不是算法题错了,是用错了场景
这里我想给出全篇第一个比较明确的结论:算法题本身没有问题,问题是被用错了场景。校招场景,候选人没有工作经验可以聊,算法题几乎是唯一可信的客观标尺,用它筛人有合理性;社招场景,候选人带着作品、职级、代码量来的,你再一刀切用算法题做主要关卡,就是筛选的懒惰。
所以你要问“该不该面”,我的回答是:该面,但校招该重面,社招该淡面。很多人反对的其实是被用错的力度,而不是题目本身。一流公司早就注意到这个问题了,不少团队在社招时会主动压缩算法轮次,把精力挪到项目深挖和系统设计上。可惜的是,还有大量公司依然沿用一套答案照搬校招模式,这才是矛盾最集中的地方。
2. 校招社招的考察尺度:算法的占比和深度完全不同
2.1 校招:算法是主线,考的是潜力不是工作量
校招场景下,算法题的分量到底有多重?往重了说,它就是第二场高考数学。为什么?因为面试官手上几乎没有其他可靠的评价维度。一个刚出校门的候选人,项目是课程设计练手,实习经历可能比较水,无法判断他的实际工程能力,唯一能客观比较的就是基础知识点和算法题。所以大厂校招普遍是笔试加多轮手撕,覆盖栈、队列、树、图、动态规划,难度可以到中等偏上,它追求的不是“会做”,而是“区分度”——把一群都很优秀的人拉开差距。
给校招生一个比较接地气的建议:算法能力决定你能不能进第一轮,项目经历决定你能走多远。你可以项目平平,但算法和基础八股如果不过关,笔试这关都过不了。反过来,算法过关了但项目一问三不知,后面几轮也会露馅。所以校招备考,算法一定是时间投入的大头,但别放弃所有项目储备,两者是递进关系而不是二选一。
2.2 社招:算法的地位降级,但不会消失
社招的算法考察完全是另一套逻辑。到了这个阶段,你能拿出来的东西太多了:过往项目、线上事故处理记录、代码评审意见、系统设计思路、团队协作的方式。面试官只需要问几个项目细节就能判断你的水平,算法题在这里的角色就不是“主角”而是“体检项”。
不同公司类型的差异很大,我简单列个表,大家可以对号入座:
| 公司/岗位类型 | 算法题重视程度 | 典型风格 | 备考侧重 |
|---|---|---|---|
| 一线互联网大厂(社招) | 中高,通常1-2轮 | 中等难度,偏经典题型 | 项目深挖+中等算法双线准备 |
| 中厂/独角兽 | 中低,视团队文化 | 简单热身或直接省略 | 以项目为主,算法过基础 |
| 外企 | 中高 | 风格贴近LeetCode,注重交流 | 熟练度+英文表达 |
| 国企/软考路线 | 低 | 重证书、工程履历 | 软考初级/中级,不卡手撕算法 |
| 外包/人力派遣 | 低 | 简单逻辑题为主,看熟练度 | 框架熟练度优先于算法 |
这张表不是绝对真理,但大体反映了现在的市场分布。外企的算法题往往更看重交流和推导,你可以在白板上慢慢聊,没有人催你;国企和软考路线干脆就不玩这套,你要是实在不想刷题,走这条路也能活得很舒服。社招候选人最怕的就是拿着一张外企的算法标准去面一家中厂,结果被问了一堆根本不在重点上的难题,反而暴露了项目深度的不足。
2.3 特殊场景:华为OD、外包和“题库化”算法考试
华为OD机考这两年问的人特别多,热词里一搜一大片“华为od算法题刷多久能过”。我统一说下我的理解:OD的机考有自己的题库和大致范围,难度曲线比大厂校招的“自由发挥”要温和,更像是“会刷题就能过”的应试型关卡。准备这样的考试,核心是效率和耐心:把主流题单刷熟、学会快速看题识别题型、注意边界用例,基本就够了。别用搞ACM的思路去准备OD,前面那种需要几万字论文级思考的题,在OD机考里出现概率很低。
反过来,如果你手头只有两三个礼拜准备时间,优先刷最高频的tag,放弃冷门hard题,是最划算的策略。至于外包岗位,算法题往往只是走个过场,面试官更关心你手上框架熟不熟练、能不能快速上手干活。所以你看,同样叫“算法题”,在校招、社招大厂、OD机考、外包岗里的权重和风格天差地别,一刀切准备只会浪费你的时间。
3. 刷题路线的实操规划:先补基础,再谈题单,最后排时间
3.1 别急着开刷:数据结构和算法基础怎么补
很多人的刷题姿势从一开始就错了。打开LeetCode,从第1题开始老老实实做,做到第5题卡住,看一眼题解,“哦原来是这样”,关掉,第二天接着第6题……两个月刷了80题,面试时碰到一道“两数之和”变种还是懵。问题出在哪里?没有知识体系支撑的刷题,刷一道忘一道,是在碰运气而不是在训练。
正确的路线是先搭知识框架,再往框架里挂题目。数据结构至少要非常熟练:数组、字符串、链表、栈、队列、哈希表、树、图。算法套路至少要接触过:排序、二分、双指针、滑动窗口、递归回溯、动态规划、贪心。你不需要每个都研究特别深,但每个都至少知道它解决什么问题、复杂度大概什么量级、代码骨架长什么样。语言方面,不管你是Java选手还是Python选手,核心是掌握算法思想而不是背语法,语言只是载体——python算法思维题和java算法题在思路上是同构的,差别只在你用哪门语言去表达。
资料方面,我不太建议一上来就抱着大部头啃,也不建议囤一堆网盘视频。市面上口碑比较好的学习路径基本是:一本讲数据结构和算法的经典教材(或者配套视频课),加上一个按题目类型分类整理的题单,再加一个能随时查题解的社区。黑马程序员那套Java笔记、C++笔记,程序员鱼皮的系列内容、各种程序员社区里的算法题解汇总,都是从入门到进阶可以参考的素材。注意一定要“跟完”而不是“存完”,收藏100G视频不如认真跟完一门30集的课。
3.2 题单怎么挑:hot100为什么“热”,它够不够用
聊到题单,“hot100算法题”确实是常年热词,我也认可它的主流地位。Hot 100的定位是“高频经典”,是LeetCode按热度、出镜率、面试冷热整理的产物,覆盖面是经过验证的,优点是社区题解多、代表性好,拿来当主线完全没问题。但它也有局限——热门题不等于全面题。图论、贪心、位运算、高级数据结构在Hot 100里覆盖偏少,这会导致你练熟了人气题但碰到冷门考点抓瞎。
所以我建议题单按“主力+补充”来配:主力用Hot 100,第一轮按标签分类刷;补充用剑指Offer或LeetCode的面试经典150题,把图论、贪心这些漏网之鱼补上。时间不够的话,优先刷高频tag,我按优先级整理过一张表,大家可以参考:
| 优先级 | 题目类型 | 原因 |
|---|---|---|
| 必刷 | 数组、哈希表、双指针 | 出镜率最高,基础中的基础 |
| 必刷 | 链表、栈、队列 | 代码细节多,容易暴露基本功 |
| 必刷 | 二叉树、递归 | 面试绕不开的经典 |
| 高频 | 二分搜索、排序 | 必须掌握,常藏在变种题里 |
| 中高频 | 动态规划 | 校招重点,社招看岗位 |
| 低频 | 图论、并查集 | 专项岗位才考,时间紧可放弃 |
| 低优先 | 数学、位运算 | 性价比相对低,有余力再刷 |
3.3 三轮刷题法:时间和节奏怎么排
刷题计划我不建议拉一条无差别长线,要分轮次、带目标地推进。我自己带人或者给朋友建议时,常推荐“三轮法”。
第一轮是“混脸熟”:按知识点分类刷经典题,不追求速度,每个套路刷3到5道就行。目标是看到题型能立刻反应出它属于哪一类、大概用什么套路,不要求一步到位写出最优解。每天安排1到2小时,连续一个月就能把这层功夫打下来。
第二轮是“练反射”:用Hot 100这类题单乱序刷,训练看到题目后的快速分类能力。这时候开始限时,一道题40分钟左右,目标是能写出暴力解加一个常见优化,如果卡住就翻题解并记录卡点。这轮大概要8周,这期间你会明显感觉到“这道题我好像见过”的次数越来越多。
第三轮是“模拟战”:按真实面试节奏走,45分钟一道题,口头讲思路、写代码、自己设计测试用例跑边界,全程不翻题解。最好找个搭子互相出题,或者用专门的模拟面试平台。这轮一两周就能完成,但价值不下于前两轮,因为它练的是从“会做”到“能在面试高压下做出来”的转化。
3.4 刷题的正确姿势:三遍原则和费曼输出
刷题的数量和质量哪个重要?这个问题争议很大,我的看法是:质量和复盘决定吸收率,数量只是副产品。真正有效的刷题遵循“三遍原则”:第一遍自己硬想,想到卡壳再看题解,理解后合上书自己写一遍;第二遍隔一天再不看题解重写,位置写不出来就标记,“哦原来上次卡在这里”;第三遍隔一周后做同类题,能举一反三,这道题才算真正是你的了。
另外我非常推荐费曼式的输出训练——把解题思路讲给一个根本不会的人听,看他能不能听懂。讲的过程会逼你把含糊的地方理清。很多程序员社区里的算法题解就是这么来的,写题解的人往往比只看题解的人收获更大。
复盘建议这样记录:题号、题目类型、我的思路、卡在哪里、最优解关键点、同类题的共同套路。坚持记二三十道,你对知识框架的感觉会完全不一样。这比在网盘里囤100G视频有用得多。
4. 手撕代码的临场发挥:思考顺序、边界测试和保底策略
4.1 拿到题目后的标准流程:先问、再推、后写
说完了题下功夫,再聊聊在面试现场的那些事。很多人题都刷得不错,但一到白板或线上IDE就发懵,原因不是不会做,而是没有一套固定的思考流程。我给个我常用的套路,你可以背下来:
第一步,和面试官确认输入。数据规模多大、有没有重复元素、排序状态怎样、能不能修改原数组、输出格式有没有要求。这一个动作看起来简单,其实是向面试官传递一个信号:这人习惯在动手前想清楚需求和约束,而不是上来就埋头写代码。
第二步,举一个小例子在脑子里或纸上推演一遍,说给面试官听。比如“假如输入是[3,2,1,4],我先排序再二分……”这个动作能帮你找到思路的漏洞,也能让面试官看到你的推导过程。
第三步,先给暴力解,再说优化。很多人怕说自己一开始用暴力解决会被嫌弃,其实不会,面试官更怕的是你半天不吱声。说出暴力解的复杂度(往往是O(n^2)),再讲优化的出发点(有没有多余计算可以去掉,能不能用额外空间换时间),这套“从暴力到最优”的分析链本身就值一大半分数。
第四步,写代码时边说边写,把你的思路外化出来。面试官没办法看进你的脑子,但他能看到你思考的轨迹。这一步很考量平时训练的习惯,如果你自己刷题时从来不说话,面试现场硬逼着自己开口,会非常别扭。
4.2 边界处理和测试习惯:高分往往藏在这一步
写完代码别急着说“我做完了”,主动再加一个环节:我自己设计测试用例跑一圈。至少要覆盖:空输入、单元素、正常情况、极端情况(比如全是负数、全是重复、溢出的数)。这几个用例跑下来,大部分隐藏的bug都无所遁形。
这一点特别值钱。我后来参加一些面试官培训的时候听到一个观点:候选人主动做测试,是区分“刷题家”和“工程思维选手”的关键信号。一个在写完代码后敢自己跑边界用例的人,往往在真实项目里也不会写完就甩手走人。
4.3 难题做不出来怎么办:保住过程分,坦诚求助
万一真碰到完全没思路的题怎么办?我给你一个保底的行动指南。
第一,不要演默剧。很多人在思考的时候习惯不说话,这对面试来说是非常吃亏的。面试官看不到你的思考过程,就会默认你不会。你可以把思考碎片说出口:“我在想能不能用哈希表记录前缀和……好像可以,但怎么处理负数呢?”这种碎碎念反而能让面试官跟得上你的节奏。
第二,把你解不动的点用语言说出来:“我现在大概知道这题可能要用回溯,但在剪枝条件上卡住了,能不能给我一点提示?”在大多数面试里,面试官是愿意给提示的,因为面试考察的是你能不能在他的帮助下解决问题,而不是能不能当独行侠。
第三,实在不行,尽量给出一种可行解,哪怕复杂度很差的暴力解。说出“最坏情况我可以用dfs穷举,复杂度是O(2^n),但显然不是最优”这句话,也比沉默十分钟然后说“我不会”强太多。拿到暴力分之后,再看看有没有机会优化——很多时候最优解就是从暴力解里找瓶颈抠出来的。
4.4 项目里的算法被追问:这其实是社招翻盘的机会
还有一个容易被忽略的战场:面试官会顺着你的项目深挖算法。比如你做过缓存模块,他会问缓存淘汰策略是LRU还是LFU,为什么这么选;你做过接口限流,他会问令牌桶和漏桶的区别;你说自己优化过列表页接口,他会追问你是怎么用索引和分页把慢查询救回来的。
这种追问比手撕算法更能考察一个社招候选人的真实水平。建议你在准备项目时,不要只准备“做了什么”,要准备“为什么这么设计”“有没有更优方案”“如果数据量再大一倍怎么扛”。这一层准备到位了,即使算法题没有碾压全场,整体评价也会上一个台阶。
5. AI改变刷题方式与面试风向:这里面的新规则
5.1 用AI刷题:是助教还是帮倒忙
今年一个绕不开的变化就是AI工具对刷题方式的冲击。有人问我:既然AI能秒解算法题,我刷题还有什么意义?面试的时候你旁边可没有AI。但平时训练倒是可以用AI当助教。
我的建议是:别让AI在第一步就给答案,先逼自己独立思考15到20分钟。实在没有思路,再让它给一个解题方向,而不是直接粘贴完整代码。等这道题写完并理解了,可以让AI帮你指出代码里的边界问题或风格问题,这个层次的帮助价值是最大的。
甚至可以让AI扮演面试官,随机从题单里给你出题、追问复杂度、扮演要你讲解的“听众”。这种模拟训练的效果不亚于找一个真人搭子,而且随时随地可用。说到底,AI改变的是你的训练方式,而不是考察标准本身。
5.2 面试风向:考察点从“能不能解”变成“怎么解的”
AI工具的普及某种程度上也在反向改变面试官的考察点。手撕代码这个环节短期不会消失,但考察的颗粒度会变:以前可能只看你最终能不能写出最优解,现在更看你写题时的思路是否清晰、边界是否周全、对复杂度的判断是否靠谱、能不能把自己的方案讲明白。
某种程度上这是好事。它把“背题家”和“思考者”区分得更清了——AI能帮你记住题解,但替代不了你分析问题和沟通的过程。这也让我想起热词里有句话叫“程序员修心”,其实挺贴切,心态稳了、逻辑顺了,手就稳了。一个能在面试现场不慌不忙把思路讲清楚的人,单独靠刷题是练不出来的。
5.3 警惕刷题上瘾和收藏家心态
还要提醒一下“刷题上瘾”这个坑。有些人刷着刷着进入心流,一天不刷反而不舒服,这种状态看起来很好,但如果只是为了面试,性价比其实在递减。刷题的本质是建立题型反射和思维肌肉,不是收集星星。每天刷10道水题,不如每周吃透3道有代表性的难题。同样道理,刷题到后期要主动从“刷题模式”切回“做项目模式”,把学到的套路用到真实代码里去,才是长久的成长方式。
6. 心态上的三个提醒:长期来看算法题到底值不值得投入
6.1 找不到工作是综合问题,别全怪算法
我说句实在话,现在的就业环境确实比以前卷,很多人的焦虑被算法题放大了。但我见过太多把问题全归因于算法的例子——项目经历薄、简历写得糙、面试沟通能力弱,这些短板随便拎出一个都可能致命,算法题只是压死骆驼的最后一根稻草。如果你最近面试不顺利,别急着把所有锅甩给算法题,把简历、项目、沟通能力摆在一起做个体检,可能更公平也更有用。
6.2 算法基础的长期价值:不只是敲门砖
从长期看,算法基础不是只在面试时值钱。它是阅读源码、理解框架、设计中间件的地基。你去看Redis、Kafka、数据库的底层实现,里面到处是跳表、哈希表、布隆过滤器、一致性哈希这些算法思想。哪怕你一直写业务代码,理解这些也能让你在排查问题、性能优化时多一点直觉。不要因为“工作中用不到”就否定它,工作需要的是它的影子。
6.3 把准备面试当成一次装备升级
最后聊点题外话。热词里有个词很有意思:程序员如何在家接私活、现在还有程序员能接活的网站吗。这说明很多人的焦虑除了找工作,还有找活干这条线。我的看法是:不管是上班还是接私活,别人对你的信任都来自你解决问题的基本功。算法题解决的是“基础素质”的入场券,但长期让别人愿意把活交给你,靠的是工程交付能力和口碑。这两件事不矛盾,只是阶段不同。
慢慢来,把刷题当成一场有计划、有节奏的装备升级。等哪天你坐在面试间里,拿到一道题,脑子里自然浮现出它的类型、套路、边界条件,那时候你就明白了,算法题面试这道坎,过不过得去不是玄学,是你是否真的用对方法去准备了。