多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

相亲遇到LeetCode接雨水:程序员如何体面应对技术突击检查

相亲遇到LeetCode接雨水:程序员如何体面应对技术突击检查 她掏出手机的时候我还以为是给我看今晚的电影场次。结果屏幕上的页面我太熟悉了——LeetCode题号42接雨水。饭店射灯把那道题照得雪亮我在心里默默叹了口气得这顿饭的“考察范围”比我上家公司的终面还明确。这件事过去一个多月了身边不少同事朋友都让我把这段经历写出来。他们好奇的倒不是相亲本身而是“一个程序员被LeetCode测试”这种事到底该怎么接招才算体面。今天就把那顿饭从头到尾拆开聊从出题人为什么会选算法题到程序员面对测试时的应激反应再到如果题目真的拍在你面前该怎么应对才能既不丢专业度也不把气氛搞僵。无论你是正在准备面试的程序员还是想搞懂程序员脑回路的非技术读者这篇应该都有点用。1. 相亲现场还原她真的掏出了一道 LeetCode 题1.1 那杯柠檬水还没上题目先来了我们是在一家小馆子碰面的环境不算吵朋友介绍时说对方做产品运营平时也接触一些技术。我当时还觉得挺好至少不用从“你们程序员是不是都修电脑”这类问题开始解释。结果寒暄不到十分钟她忽然把手机递过来屏幕朝我页面切在LeetCode的一道题上。“你在网上说自己是写代码的”她笑了一下“我刚好看题你帮我看看这个我能不能看懂。”我低头一看接雨水。第一反应不是这道题难不难而是她选得太精准了。接雨水是LeetCode热门100题里非常经典的一道知名度高解法层次丰富从暴力解到动态规划再到双指针一道题能拆出好几种水平。更关键的是它不需要什么业务背景哪怕没做过算法题的人光看题面也能大致理解在问什么。她选这道题大概率不是随手一划拉而是真的花了几秒想过。我抬头打量了她一眼她的表情里带着好奇倒没有那种“看你出丑”的挑衅。那一瞬间我心里其实松了口气。软件工程师这行当日常被经理问进度、被产品改需求、被线上报警轰炸对任何带“测试”属性的场景都会本能地加一层防御。但她的状态让我判断这道题是聊天的话题入口而不是考卷。后来她把手机又往前递了递说“你就大概说说思路就行不用写代码。”那一刻我对她的好感度反而升了一点——她先降低了门槛给了退路这在非正式技术交流里是非常得体的做法。1.2 为什么不选生活话题偏要选代码题回来之后我复盘了一个问题为什么在相亲这种场景里她宁可选一道算法题也不问“你平时几点下班”或者“你们公司做什么产品”因为生活话题太容易被“模板化回答”应付过去。问下班时间得到的无非是“看情况”“挺晚的”问公司业务背一段官网简介就能糊弄。但算法题这东西没有太多灰色空间对就是对错就是错思路清晰就是清晰含糊就是含糊。它像一扇很窄的窗口对方不用懂技术细节也能透过你的表情、语速、用词快速判断你是不是一个真正热爱这个行当的人。说白了LeetCode在婚恋语境里已经变成了一种“低成本识别工具”。安装一个App题库就在那里不需要任何额外资源。她想验证的事情其实很简单你是不是如自己描述的那样写代码以及你接触代码时的状态是放松还是应付。这两件事靠简历和职位描述都看不出来但一道经典的算法题足够。如果她换成问“Linux面试题”或者“你们用的什么框架”反而容易把我弄到另一个极端要么我在自己熟悉的领域信马由缰讲一堆外人听不懂的话要么就是双方干瞪眼。算法题的好处是它是一个相对“公平”的共同语言——题目本身简单直观难的是解题思路而这恰恰能反映一个人怎么面对未知问题。这场“测试”的本质其实不是考核而是筛选对话方向。2. 程序员看到 LeetCode 的应激反应从 PTSD 到翻白眼2.1 被“测试”戳中的其实是身份焦虑我先承认一件事看到题目的一瞬间我脑子里飞速闪过了三种回应。第一礼貌地告诉她“今天不聊工作行不行”第二这是不是某种录屏测试发到网上变成段子第三万一没讲清楚会不会显得我很水。这套应激反应不是凭空长出来的是多年面试经历训练出来的肌肉记忆。对程序员来说LeetCode很长一段时间里直接绑定着绩效、评级、offer、自我认同。刷题早就不只是学习行为它成了工程师之间的硬通货。你在社区里说某道题写了多少种解法会有人点赞你说“工作五年不刷题”大概率会被嘲讽。甚至“程序员头像”这个梗都能看出来外界对我们这行早有一套模板化想象——戴着耳机开着编辑器旁边立着一摞“Java八股文PDF”。在这种环境下算法题早就被赋予了超出题目本身的意义。所以当她亮出题号的那刻我条件反射般地把“被测试”三个字挂到了脸上。冷静下来想想这种防御其实并没必要。真正的风险不在于做不出题而在于被题目牵着走忘了对面坐着的是一个活人。还有一点工程师文化里有个很拧巴的习惯我们习惯把一切都可以量化的事情量化用可测量指标评价彼此。这种思维带进代码评审里是高效带进亲密关系里就容易出事。你写出的代码可以评分但一个人值不值得继续聊下去不是靠AC率算出来的。2.2 善意的考法和恶意的考法怎么分辨非正式场合下的“技术突击检查”其实分两种一种是善意的好奇一种是恶意的刁难。上了几年班见过不少奇葩面试官之后我觉得这件事是可以提前分辨的而且分辨方法不难。善意考法的典型特征会先给台阶允许你讨论甚至坦承自己也不懂。她当时说“你就大概说说思路就行”这就是退路。对方的姿态往往是“我想听听你怎么讲”而不是“我要看你能不能秒杀”。恶意考法就完全是另一幅样子了。我有个朋友去相亲对方也是程序员上来就开始抛八股文从HashMap扩容问到红黑树旋转最后拿一道LeetCode Hard压轴。朋友已经递了台阶说“是不是该点菜了”对方还要追一句“这题你要是没思路的话说明刷题量不够”。这种就不是交流是纯粹的胜负欲本质和“我路过球场看到有人投篮就上去单挑”差不多。我总结了一个分辨的小表后来发到同事群里他们都说挺准信号善意好奇心恶意优越感提问方式用生活语言描述题目直接报题号或名词轰炸对思路的态度愿意听你讲过程只要对错跳过过程给你台阶主动说“大概聊聊就行”你下台阶她还追着踩反馈方式接住你的比喻并继续聊用术语纠正你强调标准答案遇到善意的那类大可放心接招当作一次有趣的交流。遇到恶意的那类也没必要翻脸笑着把话题转回“你是做哪块的”就能把胜负心卸掉。毕竟这是相亲不是周赛把现场整成LeetCode周赛430赛后复盘对谁都没好处。3. 如果题目真的交到你手上一道“接雨水”的完整拆解3.1 先别急着写代码把考点翻译成人话那天她问的接雨水题面大致是这样的给定一个非负整数数组每个数代表宽度为1的柱子的高度问下雨之后这些柱子之间能接住多少雨水。我看到题之后没急着背模板而是先做了一件面试官其实都很看重的事确认边界和表达题意的理解。我问她“你希望我从哪个层面讲暴力解、优化解还是只让你听懂‘这题到底在干嘛’”她说后者。这一步非常关键它把对话的主导权重新拿回来了——我不是在被考我是在帮她理解一道题。接着我用比喻讲了一遍想象一列高低不等的墙下雨后低洼的凹坑能存水存多存少取决于左边最高的墙和右边最高的墙里比较矮的那一堵有多高。如果一边有缺口水就会流走。这个比喻讲完她眼睛亮了一下说明她真的听懂了“取左右最大值中的较小值”这个核心逻辑。如果是在真正的面试或复现场景下解题路径会更严谨一些。很多解法讲的是“对每个柱子算它左边最大值和右边最大值的较小者再减去柱子自身高度累加”。这是暴力思路下的数学表达时间复杂度O(n^2)很适合用来建立直观理解。再进一步可以用“双指针”把复杂度降到O(n)思想是左右各维护一个最大值哪个小就先结算哪一侧因为较小的那一侧已经确定了当前柱子的存水上限。3.2 从暴力解到双指针顺便聊点 AI 冲击暴力解的代码是这样很短用来入门足够def trapBrutal(height): ans 0 n len(height) for i in range(n): left_max max(height[:i 1]) right_max max(height[i:]) ans min(left_max, right_max) - height[i] return ans优化后的双指针版本也不长适合现场边讲边写def trap(height): if not height: return 0 left, right 0, len(height) - 1 left_max, right_max height[left], height[right] ans 0 while left right: if left_max right_max: left 1 left_max max(left_max, height[left]) ans left_max - height[left] else: right - 1 right_max max(right_max, height[right]) ans right_max - height[right] return ans我把这两版都跟她讲了但她最感兴趣的其实是另一件事既然网上天天说“AI可能要取代初级程序员”那为什么还要花时间刷这种题我给了她我的真实看法。算法题训练的不是“背一个标准答案”而是拆解问题边界和分析约束的能力。拿接雨水来说真正重要的不是记住双指针怎么写而是理解“为什么这个场景可以用左右夹逼”以及“什么条件下这种优化会失效”。AI确实可以秒掉一道题但它没法替你在工程现场做权衡是要可读性高的暴力解还是要省一半时间的双指针是牺牲一点运行速度还是多耗一点脑筋。这种取舍判断恰好是初级程序员向高级工程师爬升过程中必须反复练习的肌肉。她听完说了一句我印象很深的话“所以你们刷题不是为了做题是为了练一个解决问题的脑回路。”我点了点头觉得这场“测试”已经从一道算法题变成了真正的对话。4. 比解题更值钱的是“技术翻译能力”4.1 把算法题讲成一个下雨天的故事如果那天我只是熟练地写完双指针然后等她鼓掌这顿饭大概率会在十分钟内冷场。真正把气氛救回来的是我把这道题翻译成了她能直接感受到的生活场景。我当时是这么讲的“你想一下下雨天路面坑坑洼洼水洼都存在坑里。一个坑能存多少水不取决于这个坑有多深而取决于它周围那几家高出来的地儿到底有多高。如果东边那堵墙很矮水早就顺着缺口流走了存不住。”她听完接了一句“所以关键是要找坑两边最高但相对矮的那个墙”我说对就是这个意思。这个瞬间让我意识到一件事程序员最值钱的能力之一其实是把专业术语翻译成人话的本事。很多人在网上分享经验时习惯直接扔术语什么“单调栈”“前缀最小值”“状态转移”对同行来说没问题但对非技术读者来说就像天书。技术翻译能力本质上是一种共情能力你得先搞清楚对面的人水平在哪、关心什么才能决定用什么比重讲故事。后来的对话走向是我开始讲工程里真正特别的场景——线上接口有一天突然慢了排查了半小时最后发现是有同事在代码里用字符串拼了个大SQL导致索引失效。她听得兴致勃勃还问“那后来怎么办”。这种项目复盘比双指针解法更能让人了解我的做事风格也更符合“相亲聊天”的节奏。4.2 非正式场景下展示水平的 3 个动作从这一顿饭里我总结出了三个在非正式场景下展示技术水平的动作后来在和同行、朋友甚至跨部门同事打交道时也验证过挺好使。第一个动作是“先复述需求”。任何人给你抛一个技术难题别急着给答案先用两三句话把问题复述一遍确认边界。这在面试里叫clarification在日常生活中就是“你耐心确认对方需求”它直接传递出你做事稳而不是抢答。第二个动作是“用对方熟悉的类比拆解流程”。讲技术的时候先找对方生活里已经理解的东西做拢共的比喻。比如讲数据库事务可以讲“转账过程中断了要回滚”而不是直接讲redo log和undo log。比喻不一定完全严谨但能把抽象的思考路径搭起来。第三个动作是“主动暴露踩过的坑”。没有经验的程序员喜欢展示“我什么都会”有经验的程序员反而喜欢讲“我在这里犯过蠢”。因为讲坑才是讲真实的工程世界设计永远比口号看起来复杂线上环境永远比教科书调皮。主动讲坑不但不会丢面子反而会让对面的人觉得你真实、可信加分项远超一句标准答案。当然这三个动作有个前提你确实具备相应的技术储备。没有储备空有技巧换来的顶多是“聊得挺热闹”没法真正让人相信你的专业度。翻译能力建立在原语言上先有输入才有输出。5. 同类场景速查如何回应别人对你的“技术突击检查”5.1 避坑清单这几件事千万别做吃饭之后我又问了一圈身边朋友发现被亲戚问“帮我看看电脑怎么这么卡”、被朋友问“你怎么不去修手机”、被陌生人问“你能黑进谁谁谁的账号吗”几乎是程序员的日常。这里有一套我在多个场合下反复打磨出来的回应原则先放避坑清单别背八股尤其别报题号。一张口就是“这题我知道LeetCode 42题”会瞬间从“交流”退化成“播放录音”。对方想听的是这个人怎么思考不是百度快照。别掏出手机当场搜答案。无论是搜题解还是翻技术博客都极其败人品。真不知道就坦然说不知道再补一句“但我会从哪些角度去查”比现场搜答案体面得多。别用术语轰炸。哪怕你满脑子都是“前缀最大值”“双指针夹逼”“空间换时间”也要在话出口前做一个翻译。术语越多对方越觉得你在防守。别较劲说“这题没意义”。算法题确实不等于实际工程这话本身没错但在非正式场合讲出来就有点杠精味道。更好的说法是“这题在实际工程里通常有别的解法不过思路挺有意思。”别当场翻GitHub、LeetCode主页来证明自己。这种行为看起来像在说“你看我真的刷了300题”实际效果更像面试机器自证和相亲氛围完全不在一个频道。以上几条我几乎都亲眼见过别人踩。最常见的翻车现场是聊到一半有人非常骄傲地说“这题我闭着眼都能写”然后现场调试十分钟没跑通。场面一度像极了年会上提前准备好的爆款段子突然念错稿。5.2 应对公式与常见问题排查想稳一点的话可以按四步走先接纳再拆题后讲故事最后递台阶。接纳是接住对方的提问不论题目多简单或多离谱都先给对方一个正向反馈类似“这题有意思不过我先说说我理解的题意”。拆题是用一两句话把题目的本质抽出来比如“这道题其实在问一个数组里每个位置能存多少水核心是找左右边界”。讲故事是把拆出来的思路套到生活场景里让对面的人感觉到你脑子里不是线性的格子而是一幅画面。递台阶是在讲完之后主动问“你是想听数学层面的解法还是更关心这个思路能用在哪”把话语权和节奏感还给对方。如果对面想进一步“硬考”那大概率会进入更专业的细节问题比如“为什么双指针是对的”或者“能不能扩展到二维场景”。这时候反而说明对方感兴趣或真的有底子你只需要保持技术人员的正常交流节奏即可。下面是几个常见场景的速查应对时可以直接参考你遭遇到的情况可能的原因建议处理办法被问一道完全没见过的题对方随手挑的或者本身就难先复述题意说出最直觉的暴力思路再提出优化方向写了一版思路但没写对紧张或者边界没考虑全承认当前思路有问题口头列举可能的边界情况展示调试思维对方说自己完全听不懂你的类比不够生活化换一个更贴近对方的场景比如用存钱、排队、停车之类对方用网上流传的奇怪测试模板对方只是图一乐当娱乐性对话接住不较真也不冷场对方在你的领域零基础但想了解对方在释放善意保持开放用最小的例子讲清楚一件事哪怕只讲一分钟还有个小技巧如果对方执意要把这场“测试”完成得像正式面试一样严肃你有权主动提出换一种方式——比如不写代码改成“我们一起做一次思想上的code review”。大部分程序员都有过review代码的经历把场景切换成合作模式很多紧张感会自然缓解。因为合作天然带着沟通和让步而考试天然带着评判和被评判的紧张。另外网上很多“测试开发”“自动化测试框架pytest”“AI测试开发”之类的词也和“程序员被测试”这些事情被网民一起打包消费。说实话测试本身不是毒药它只是一个中性动作——你测一个水龙头的出水量不代表你怀疑水龙头坏了可能只是好奇它能不能扛住大雨。互联网上那些“相亲考LeetCode”“用提示词盘问AI”的段子本质上也是在娱乐化地理解一个群体。既然能被当成段子说明这事已经足够普遍不值得上头。最后说点实际操作里的真心话那天晚上我最后并没有在她面前完整写出双指针的最优解。我在纸上画了一排高高低低的方块把“雨怎么存”“水怎么流”的故事讲了一遍然后把手机推回给她说“你想验证我是不是程序员其实不用靠AC率。你给我一个你完全不懂的场景我把我的思路讲到你能听懂这才是我的真本事。”后来的事情是我们又聊了两个多小时从算法聊到工程从工程聊到加班再聊到我们各自喜欢的城市。那道接雨水她后来自己刷了一遍还专门发消息告诉我她看懂了解析。我没有追问她有没有背上标准答案因为那已经不关LeetCode的事了。我把这一整段经历写下来最想说的是程序员这个群体确实长期活在“被测试”的氛围里简历被筛选、代码被审查、刷题量被围观连网上那些“程序员头像”的梗都在帮我们贴上某种标签。但测试从来不是目的它只是一次让对方认识你的窗口。你真正要练的不是每题都会做而是哪怕遇到一个完全陌生的问题也能先稳住、再拆解、最后用自己的话讲明白。这种能力比在周赛里拿个好名次有用得多也远比能默写一整套“八股文PDF”更能在生活里站得住脚。
返回列表