尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

程序员面试算法题备战指南:从Hot 100到外包OD全解析

程序员面试算法题备战指南:从Hot 100到外包OD全解析 直接进入正文。程序员面试要不要考算法题这个问题在脉脉上吵了十年也没吵出个定论。支持的人说算法题是筛人最公平的方式反对的人说工作三年根本用不到快排。但现实很残酷只要你还想进大厂或者想拿高薪offer算法题就是绕不过去的坎。与其争论该不该考不如花时间想清楚怎么准备。这篇文章不站队只讲实操——我把校招、社招、外包、OD这些不同场景下算法题的差别拆开讲再把从零开始怎么刷题、刷什么、刷多久的完整路径给你捋一遍。准备换工作的、秋招春招要上场的、自学编程想入行的都能从里面找到自己的位置。1. 先搞清楚算法题到底在面什么很多人把算法题当成智力测试觉得面试官出题就是为了刁难人。我见过不少简历很漂亮、项目经验也扎实的候选人一看到没见过的题就慌了开始后悔自己是不是智商不够。真不是这样。算法题的核心目的不是考你能不能想出天才解法而是在有限时间内考察你四件事基础数据结构熟不熟、代码能不能写利索、遇到问题有没有分析路径、压力下能不能保持沟通。1.1 算法题不是考智商是考基本功你说工作中用不到红黑树这我信。但你别忘了面试官想通过算法题看到的是你大学四年或者自学阶段有没有把计算机最底层的东西嚼烂。链表反转、二叉树遍历、动态规划状态转移这些东西就是程序员的基础功跟运动员每天练的深蹲卧推一样——正式比赛里没人会单独比深蹲但深蹲力量决定了你跑跳的上限。换个角度想面试官也很无奈。一个候选人简历写着精通Java参与过xx项目他到底什么水平项目可能是抄的代码可能是复制粘贴的。唯独算法题很难造假几十分钟的实时交互里你几斤几两一测就知道。所以与其说算法题是门槛不如说它是最不容易被包装的试金石。再直白一点刷算法题养成的能力实际工作中真的用得上。设计接口时有没有考虑边界条件、处理线上问题时能不能快速定位哪段逻辑复杂度太高、写SQL时会不会下意识看执行计划——这些习惯不是凭空来的都是刷题刷出来的肌肉记忆。1.2 主流大厂和普通公司面试算法题的差别很大这里要先浇一盆冷水不是所有公司都配考算法题。我面过上百家公司的岗位总结下来大致分三类。第一类是头部互联网大厂和部分独角兽。这类公司题库成熟、流程规范算法题是技术面试的必考项而且往往有两三轮。题目难度一般在LeetCode中等题为主偶尔有一道困难题压轴。像字节、阿里、腾讯每轮面试都会手撕一道或两道算法题写不出来基本就凉了。第二类是中型互联网公司和传统行业数字化部门。这类公司会考算法题但占比没那么重。一般只在一面或者笔试题里出现难度以简单和中等为主偶尔考一道经典的比如反转链表、两数之和这类。重点还是看项目经验和业务匹配度。第三类是外包岗和部分中小型项目制公司。说实话这类岗位考算法题的比较少更看重你能不能直接上手干活。SSH连服务器会不会、Linux命令熟不熟、框架会不会调这些比算法题重要得多。因为外包单价压得低项目工期紧没人有时间陪你从排序算法开始聊。不过凡事都有例外。这两年不少公司学了一线大厂的面试流程不管公司大小都先甩几道算法题。我有个朋友去面一家不到一百人的公司技术面三道算法题起步一问薪资也就那样。这种公司我个人不推荐去——算法题是筛选手段但不是衡量一个程序员价值的全部如果一家公司用算法题当唯一的度量衡说明它对自己的业务判断力也不太自信。2. 校招社招差别巨大先找准自己的定位很多刚准备面试的人最纠结的一件事就是跟着网上的面经走不管自己是什么阶段、面什么岗位上来就是Hot 100刷三遍。这其实是个很大的误区。校招和社招对算法题的要求、考核方式、准备策略有本质区别。先搞清楚自己在哪个赛道上再安排时间也不迟。2.1 校招算法题重基础几乎必考校招是一个很特殊的招聘场景。候选人基本都是学生没有多少工作经验可聊那面试官考察什么只能考察基础。数据结构、操作系统、网络、数据库、算法题这五座大山就是校招的主战场。尤其大厂校招算法题的比例非常高。笔试阶段就是纯算法题加选择题通常一到两个小时做三到四道题过了笔试才有面试机会。到了面试环节每个技术面基本都会出算法题有的面试官会结合你简历里写的项目来出题。比如你写了用Redis做了缓存他可能就让你实现一个LRU缓存淘汰算法你写了负责订单模块他可能让你手写一个带有过期时间的内存缓存。校招刷题要从大三或者研二就开始这是老生常谈但不得不谈。因为算法思维的建立需要一个长期过程临时抱佛脚一个月和认真刷三个月效果天差地别。我自己当年校招前大概刷了六个月平均每天两道题才勉强在大厂面试时不慌。还有一个关键信息校招笔试的难度通常比面试要高。笔试没有人跟你互动不会给你提示而且题量很大很多人笔试就挂了。所以笔试前一定要做限时训练LeetCode的模拟考试功能多试试把握好节奏。2.2 社招算法题看岗位级别越高手感越重要社招跟校招完全不一样。你有工作经验了面试官第一眼看的一定是你的项目经历、技术栈匹配不匹配、能不能来了就干活。但算法题还是会出现只是形式变了。初中级社招岗位算法题一般考得比较浅。常见的有两种考法一种是直接来一道LeetCode原题或变种题难度偏简单和中等另一种是结合业务场景的算法题比如如何设计一个接口的限流策略如何高效地合并多个有序链表考察的是你在实际业务里能不能用合适的算法解决问题。高级岗位和专家岗位算法题往往不是独立环节而是揉在系统设计和技术方案讨论里。比如聊缓存穿透的时候面试官可能会问如果让你实现一个带过期时间的分布式锁你会怎么设计。这时候数据结构、算法复杂度就不再是考试题而是方案设计的底层语言。级别越高算法越不是背题而是看你能不能根据场景信手拈来。所以社招准备算法题我建议先去看目标公司的面经确认面试轮次和算法题占比。如果目标是大厂那不能掉以轻心如果目标是创业公司或者传统企业把常见题刷熟就够了时间更多花在项目和系统设计上。2.3 外包岗和OD类岗位算法题要求完全不一样最近裁员潮之后外包岗和OD类岗位的热度明显上来了。我看到热词里有程序员外包还有华为OD算法题刷多久能过说明越来越多的人在认真考虑这条路径。这类岗位面试侧重点值得单独说说。外包岗通常指人力外包行政关系、薪资发放、社保都在外包公司日常在驻场公司办公。这类岗位面试一般以技术面试为主考算法题的比例很低。面过几家外包岗位的读者应该知道问的多是框架、工具链、项目经验比如Spring的Bean生命周期是怎样的Redis的持久化机制有哪些算法题基本是简单题像数组去重、字符串反转这种级别。华为OD则比较特殊它属于研发岗位的外包编制但面试流程和转正机制相对正规。OD的技术面试也会考算法题难度区间大约在LeetCode简单到中等之间。热词里有华为OD算法题刷多久能过我个人见过的情况是如果有一周时间集中刷题每天保证3到4道高频题通过机考问题不大。关键是机考环境一定要提前适应OD机考用的是牛客网的平台输入输出处理和LeetCode不一样至少提前三天用牛客网练一练手。我的建议是外包岗的候选人把算法时间砍一半留出精力把框架原理和项目复盘做好性价比更高目标OD的把Hot 100简单中等题刷透再做几套往年机考原题就够了。3. 算法题到底考哪些如何按题型拆解准备算法题看似无边无际其实常考范围很固定。LeetCode上两千多道题真正面试常考的不到五分之一。与其没有头绪地刷不如先摸清题型的分布再按题型逐个突破。3.1 常考题型盘点数组、链表、哈希、双指针、二叉树、动态规划我总结了一下校招和社招面试里出现频率最高的几类题大概覆盖了80%以上的面试题。数组和字符串是基础中的基础。双指针、滑动窗口、前缀和这些技巧全都在数组类题目里出现。面试官最喜欢拿这类题来热身因为代码量不大但能考察你代码写的是否干净利落。比如三数之和最长无重复子串这两道题几乎每个大厂面试官都爱用。链表是数据结构的地基。反转链表、合并有序链表、判断链表中是否有环这三道题加起来可能出现过上万次面试。链表题代码量不大但很考验指针操作的细节稍不留神就空指针异常。我面试别人的时候也爱出链表题因为能通过候选人写代码时的熟练度快速判断他有没有真正理解引用传递。哈希和前缀和是优化工具的担当。很多暴力解法用一层哈希就能把时间复杂度从O(n^2)降到O(n)比如两数之和。这种优化思维在面试中非常值钱因为面试官想看你有没有先想暴力解、再想办法优化的意识。二叉树相关的题本质是考察递归和层级遍历。前中后序遍历、层次遍历、最大深度、最近公共祖先这些是高频中的高频。二叉树题写起来有套路先判断根节点是不是空然后想清楚当前层要做什么递归处理左右子树。掌握这个套路大部分二叉树题都能解。动态规划是所有人心里的坎。说实话如果面试中出了难题难度的动态规划大部分人都写不出来面试官也心知肚明。所以他们常考的反而是经典的、有套路的DP题比如爬楼梯、打家劫舍、最长递增子序列。动态规划的解题框架是定义状态、写出状态转移方程、确定初始化和遍历顺序。把这几步想明白再写代码比上来就写要稳得多。还有排序与二分查找这个经常被忽略。手撕快排和归并排序在面试中出现的频率不低二分查找则是考察边界条件控制的好题目。记住一个口诀排序考实现、二分考边界。3.2 Hot 100 到底怎么刷刷几遍才够热词里出现了hot100算法题这说明大家对LeetCode的经典题单已经有共识了。Hot 100确实是准备面试的黄金题单它是LeetCode官方根据数据热度整理的100道题基本上覆盖了所有常考题型的高频代表。很多人觉得自己刷完Hot 100就稳了真不是这样。我的建议是至少刷三遍。第一遍是按标签刷。比如这一周只刷数组和哈希相关题目下周只刷二叉树。这样做的好处是能帮你建立遇到什么题用对什么招的敏感度刷完一个标签马上就能总结这个标签下的套路。第二遍是乱序刷。这一步很关键因为面试不会告诉你这道题属于哪个标签。打乱顺序刷能强迫你自己判断题型、选择方法这才是面试时的真实状态。我见过很多人按标签刷了好几遍一上考场发现题目没见过就懵了就是因为第二遍乱序刷省掉了。第三遍是限时默写。一道题给自己20到30分钟超时就去看题解然后第二天再手写一遍。这一遍的目的不是学新题而是把高频题变成肌肉记忆。尤其在你已经工作、时间紧张的情况下第三遍不用全刷挑50道最高频的就行。至于刷完Hot 100够不够校招想冲大厂Hot 100只是及格线建议在此基础上把LeetCode上Top Interview 150的题再看一遍。社招目标中等公司Hot 100三遍完全够用。目标外包或ODHot 100简单题和中等题刷完足够应付。3.3 编程语言选Java还是Python各有各的套路热词里有python算法思维题和java算法题说明大家也关心面试时到底用哪种语言刷题。我的结论很明确校招面试用Java或C更有优势社招和笔试阶段用Python提升效率但面试手撕代码要选自己最熟的语言。大厂面试手撕代码环节面试官不会限制你用什么语言。但Java和C在表达数据结构时更贴近底层写链表、定义二叉树节点时能看出你对内存布局和引用的理解。我自己做面试官的时候候选人用Java写算法题我会多问一句这里的HashMap扩容机制是什么如果回答得好就很加分。Python在上机笔试阶段效率最高代码量少内置函数丰富适合快速解题。但面试时如果只会Python有些考底层原理的题目会吃亏。还有一个实操细节一定要在面试前确认好公司的OJ平台。有的公司用LeetCode有的用牛客网还有少数公司用自家的在线IDE。特别是牛客网它的输入输出模式跟LeetCode完全不同需要自己处理Scanner和System.out不提前练一练很容易翻车。4. 实操准备路线从零到面试的时间安排每个来问算法题该怎么准备的人心里真正想问的话通常是一句我现在开始还来得及吗。我的回答分情况如果还有两个月以上按部就班来完全来得及如果只有两周到一个月也有速成的打法如果只剩三天请直接去看你目标公司的面经和最近的真题抓大放小只刷高频题。下面给一套通用的八周准备路线覆盖大多数人的情况。4.1 第一阶段基础数据结构扫盲第1周~第2周这一阶段的目标不是刷题而是把基础数据结构过一遍。数组、链表、栈、队列、哈希表、二叉树、图、堆、前缀和、差分这些概念要在脑子里形成完整图谱。每天抽一到两个小时看理论另外一到两个小时做对应的简单题练手。这里有一个比较高效的学习路径先看一遍数据结构的定义和实现思路然后去LeetCode上找一道对应的题目用15分钟尝试自己写写不出来再去看题解。这个过程虽然慢但每道题都会记得很牢比直接背题解有用得多。这一阶段的输出是能独立写出几种基础数据结构的Java或C实现。注意是独立写出不是照着书敲一遍。能徒手写链表反转、手写一个包含扩容机制的HashMap这阶段就算过关了。另外建议整理一份自己的笔记把每种数据结构的操作和时间复杂度记下来后面写题解时候会很有用。热词相关的黑马程序员Java笔记C笔记本质也是让大家从笔记中提炼知识框架比看完整的视频课会快很多。4.2 第二阶段高频题型专项突破第3周~第6周这个阶段开始按标签刷题。建议的顺序是数组与哈希1周、双指针与滑动窗口4天、链表3天、二叉树1周、深度优先和广度优先搜索4天、动态规划1周。这样排下来四周多一点剩下的几天用来补充。专项突破阶段的核心方法是总结套路。每做完一道题都要在笔记里回答三个问题这道题属于什么类型核心解法是什么时间和空间复杂度是多少刷到后面你会发现同类题的解法是有公式的。比如左右指针解决有序数组问题、快慢指针解决链表环问题、滑动窗口解决子串问题这些套路总结得越细做题速度越快。每周抽一天时间回头复习本周做过的题。算法题最大的敌人是遗忘不复习的话两周前刷的题就白刷了。复习时不用重新写完整代码在草稿纸上画一画思路、写出关键逻辑判断的边界条件就能快速唤醒记忆。这一阶段每天用多少时间取决于你的余量。在校生全天备考的话每天至少四个小时在职准备社招的话每天两小时是底线达不到的话周期要相应拉长。4.3 第三阶段真题模拟与面试专项第7周~第8周到了最后两周不要再漫无目的地刷新题了。这个阶段的核心是模拟真实面试场景练的是抗压能力和表达节奏。每天做一套限时训练模拟笔试场景。LeetCode的周赛题目和牛客网的企业真题都是很好的材料。这里重点说下牛客网很多公司笔试就是直接用牛客网的平台提前熟悉它的输入输出格式、异常处理、运行环境能避免很多低级失误。我见过太多人在牛客网机考时挂在读字符串上一道题50%的用例过不了就是因为没用对nextLine和next的转换。面试表达也要专门练。找一个朋友扮演面试官或者对着录音设备自问自答。看到一道题先说自己的解题思路再说复杂度然后动手写代码写完主动跑几个测试用例验证。这整个流程要练到流畅自然尤其是先讲思路再写代码这个习惯很多人在面试时不适应一上来就开始写写完就停面试官问他复杂度他还要现想——这些都是平时没练过的表现。这个阶段还要把之前的错题本拿出来过一遍。每道错题重新写一遍完整代码重点看边界条件有没有漏、有没有在没思路时看了题解的题。看题解可以但一定要在第二天独立写出来不然面试时那道题就等于没做过。4.4 校招/社招刷题时长参考很多人在刷题前最想问的就是我到底需要准备多久。这个问题没法一刀切跟你的基础、目标岗位、每天能投入的时间都有关系。我给一个参考区间方便你倒推时间。基础较好的科班在校生目标一线大厂建议准备3到6个月每天2到4小时。基础一般的科班生或者转码选手目标中型公司建议准备2到3个月每天3到4小时。在职准备社招目标一线大厂建议给自己留2个月每天保证2小时周末补4小时因为社招候选人的算法题占比虽然略低但一旦考到难度往往不低。在职准备社招目标中型公司或外包/OD建议准备3到4周每天1到2小时高频简单题加中等题就够了。这只是参考不是死规矩。核心原则只有一个当你做题不需要看题解、能独立分析新题并讲清楚思路时就可以去面试了。记住这个标准比刷够多少天更靠谱。5. 常见问题与避坑实录这些都是别人踩过的坑最后这部分聊一些实际遇到的问题。我不讲理论只说我观察到的真实情况和我自己踩过的坑这些内容在面经里不太会被写到但往往是最影响面试成败的细节。5.1 刷题无数还是不会新题怎么办这是最打击人的状态。你明明把Hot 100刷了三遍面试官出了一道你没见过的变种题脑子瞬间一片空白。问题出在哪儿大概率是你刷题时只记住了答案没有形成分析框架。我在前面反复强调要总结套路原因就在这。面试时遇到新题正确的思考路径应该是这道题是求最优解还是求可行性数据范围多大用什么数据结构可以组织当前的数据是搜索问题还是规划问题把这些问题在脑子里过一遍即使最后还是不会做你也能和面试官聊出一些有效信息而不是沉默着憋一句我不会。另外要接受一个事实面试中遇到做不出来的题非常正常。面试官出困难题的目的很多时候不是等一个满分答案而是看你在面对未知问题时的态度和思路。所以遇到不会的题先别急着放弃把能想到的思路讲出来哪怕是很暴力的解法也可以说。能说出暴力解都比什么都不说强。5.2 紧张到手抖、大脑空白怎么破我当年第一次面试时面试官让我写一道反转字符串特别简单的一道题我当时脑子直接一片空白手放在键盘上都不知道怎么按。后来我总结了一下紧张的原因是把面试结果看得太重以及模拟面试做得太少。破解方法有两个。一个是降低预期把面试当成一次免费的模拟考面挂了不亏面过了等于白赚。心里负担小了反而更容易正常发挥。另一个就是多做模拟面试怎么模拟都不嫌多。我后期准备面试时每个周末都会用牛客网的在线面试功能找完全陌生的题目限时做习惯了被注视的感觉真正面试时就没有那么慌了。还有一个很实用的小技巧面试开始时先和面试官聊两句问一下今天的面试流程和时间安排。这个动作能帮你快速进入对话模式减轻紧张感。而且你主动问流程会显得你很有经验也是第一印象分。5.3 面试时要不要说出思考过程复杂度和优化要不要主动提这条建议很直接一定要说而且要从头说到尾。正确的答题节奏是分四步的。第一步先复述题目跟面试官确认你的理解没有偏差。第二步说思路比较暴力的解法也先说出来。第三步分析暴力解的复杂度然后提出你可以优化的方向再讲优化后的解法和复杂度。第四步动手写代码写的时候一边写一边说关键逻辑。很多候选人话特别少拿到题就埋头写写完直接说写完了。面试官也很尴尬只能自己看代码理解你的思路就要花半天时间体验自然就差了。技术面试首先是一次沟通代码只是你们沟通的载体。表达能力强的候选人就算最后没解出来面试评价也不会太差。复杂度为什么一定要主动提因为这是面试官判断你对算法理解深浅的重要依据。光写出代码但说不清楚为什么是这个复杂度面试官会默认你只是背过这道题。反过来提前把时间复杂度、空间复杂度讲明白哪怕没有写出来最优解面试官也会觉得你的思维方式是合格的。5.4 算法题挂了是不是就没机会了分情况。笔试阶段如果是全A但也有不懂的题挂了那是水平差异心服口服。但面试环节算法题没写好不代表全盘结束。我做过好几次面试官在面试评价表上算法题只是其中一个维度。我会综合看候选人的项目经验、表达能力、解决问题的思路、还有沟通中的思维品质。如果算法题答得一般但项目聊得特别细、思路特别清楚我也会给过。反过来算法题写得飞快但项目一问三不知评价也不会高。大厂面试有多轮一轮表现不佳后面几轮还有翻盘机会。所以面试过程中如果某道算法题答得不顺利不要心态崩掉后面还有机会在后面几轮表现自己。出了面试题答砸了复盘原因隔两周再投别的部门甚至别的公司照样有大量机会——程序员就业市场再卷也卷不到一个持续精进的人头上。常见问题速查表问题快速建议还有多久面试时间来不及怎么办先翻目标公司最近的面经只刷出现频率高的简单中等题直接看题解背思路不钻难题刷题用Python还是Java笔试选Python省时间面试手撕代码选自己最熟的语言能用Java/C更好面试时遇到完全没思路的题别沉默讲暴力解讲尝试方向让面试官看到思路动态规划总是不会先背十道经典DP题的套路掌握状态定义和转移方程写法再练变种牛客网和LeetCode怎么选两个都要练。LeetCode刷题用牛客网练机考输入输出处理和企业真题要不要做周赛或者每日一题有时间的可以做没时间就重点刷Hot 100和企业真题外包岗/OD岗算法题怎么准备简单中等题够用OD要额外适应牛客网机考环境说实话算法题在程序员面试里的权重这几年在慢慢变化。有些公司开始增加系统设计和项目深挖的比例减少算法题轮次。但大环境如此短期内在国内一线互联网公司算法题依然是筛选候选人的重要标尺。我在实际跟候选人打交道过程中最大的感受是大家对算法题的态度经常走极端要么觉得它就是一切疯狂刷题到忽略项目和沟通要么觉得它就是形式主义完全不屑于准备。这两种人都容易吃亏。说到底算法题只是面试的一个环节它反映的是你愿不愿意花时间去理解计算机的基础逻辑。理性看待它用适合自己的方式去准备面试时正常发挥你就已经跑赢大多数人了。最后分享一个我自己的切身体会刷题最忌讳的就是跟别人比进度。有人三个月刷了八百道题有人三个月把Hot 100刷了三遍后者往往比前者面试表现更稳定。算法面试考的是见多识广不假但更考熟能生巧。一道题刷三遍比你刷三道新题有用得多。哪怕每天只刷一道题坚持两个月你的面试状态也会完全不一样。
返回列表