尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

贝壳找房2023校招算法卷2复盘:KMP、动态规划与业务场景全解析

贝壳找房2023校招算法卷2复盘:KMP、动态规划与业务场景全解析 最近帮朋友复盘贝壳找房2023届校招算法卷2正好手头还留着当时的笔记和部分题目回忆整理了一篇完整拆解。这份卷子整体难度在中上水平既有经典的算法题也有一些跟业务场景结合得很紧的题目涵盖的考点比较全KMP、排序、贪心、动态规划、机器学习概念都有涉及。如果你是准备房产交易、本地生活这类偏业务的技术岗或者单纯想看看校招算法卷都考什么这篇应该能帮你少走不少弯路。1. 试卷整体设计与考察思路拆解贝壳找房的算法岗校招笔试其实一直都在传递一个信号他们不只要你刷题还要看你能不能把算法跟真实业务场景挂钩。2023届这份算法卷2整体题量不算大但每道题都留了足够的“深挖”空间做题的时候能明显感觉到命题人想考察的不是“你会不会背模板”而是“你在新问题面前能不能拆解、能不能选型、能不能落地”。从题型分布来看大致可以分成三块。第一块是经典的算法基础题主要覆盖字符串匹配、排序、贪心、动态规划和搜索剪枝。这类题占的分值比较高基本是刷过《剑指Offer》和LeetCode前200题就能应付的难度但有个别题目在状态定义上做了变化比如动态规划的状态转移方程不是常规的线性DP而是需要再加一层维度的区间DP这个如果平时没练过现场容易卡住。第二块是算法原理问答题考察的内容跟热搜词里的方向高度重合——KMP的next数组怎么求、快排的最坏情况怎么避免、粒子群算法的速度更新公式为什么要有惯性权重、模拟退火和贪心的区别这些。这类题看似是送分题实际上很考基本功因为很多同学刷题的时候只写代码根本没有回头看算法本身的数学推导和适用边界遇到这种题反而最慌。第三块是业务场景设计题这是贝壳找房跟纯互联网大厂算法卷最不一样的地方。题目会给一个跟房源推荐、估价、搜索排序相关的业务场景然后让你用算法方案去解决。比如有一道题是给定用户的浏览行为序列要预测用户可能感兴趣的房源标签这个乍一看是推荐系统的常规问题但其实考的是序列建模和对业务指标的理解。这种题没有标准答案考察的是思维链路是否清晰。从整体来看这份卷子的设计思路是“基础算法 原理理解 业务迁移”三层递进。前两层筛掉基本功不扎实的候选人第三层考察的是真正做业务算法的潜力。所以备考的时候不能只看代码题也要花时间把算法原理讲明白同时多思考算法在房产这类重决策场景里怎么用。2. 核心算法考点解析与实操要点2.1 字符串匹配与KMP算法的next数组细节这份卷子里有一道题直接考察KMP算法的next数组计算给的模式串是abacaba要求写出整个next数组。这道题表面上是送分题但命中率其实不高因为很多人只记得“next[i]表示前缀和后缀的最长相等长度”这个结论但具体到边界条件怎么定义、下标从0开始还是从1开始不同教材习惯不一样考试一紧张就容易算串。我个人的建议是考试时先明确next数组的定义方式。卷子里特别标注了“next[i]定义为模式串前i个字符组成的子串中最长相同前后缀的长度其中next[0] -1next[1] 0”这种情况下计算过程是对于abacabanext[0] -1特殊约定next[1] 0子串a没有真前后缀next[2] 0子串ab前缀a不等于后缀bnext[3] 1子串aba前缀a等于后缀anext[4] 1子串abac前缀a等于后缀c不对最长相同前后缀还是只有a因为ab不等于acnext[5] 2子串abaca前缀ab等于后缀ca不相等前缀a等于后缀a长度2的话前缀ab和后缀ca确实不等所以next[5]应该是2需要仔细算子串abaca的前缀a、ab、aba、abac后缀a、ca、aca、baca。最长相等的是a但aba和aca不相等。等等让我重新检查abaca后缀长度为3的aca前缀长度为3的aba不相等。长度为1的a相等。所以next[5] 1我再核一遍。这里发现上面写错了。重新认真算模式串a b a c a b a 下标 0 1 2 3 4 5 6next[i]定义为前i1个字符因为从0开始的最长相同前后缀长度。按定义next[0] 0next[1] 0next[2] 1aba最长相同前后缀为a长度1next[3] 1abac最长相等前后缀还是anext[4] 2abaca最长相等为a不对abaca前缀ab和后缀ca不等前缀a和后缀a等所以是1。但我记得abacaba整体最长前后缀是3aba。让我逐项算i0子串a无真前后缀长度为0i1子串ab前缀a后缀b不等0i2子串aba前缀a、ab后缀a、ba。最长相等是a长度1i3子串abac前缀a、ab、aba后缀c、ac、bac。最长相等还是a长度1i4子串abaca前缀a、ab、aba、abac后缀a、ca、aca、baca。最长相等是a长度1但aba与aca不等ab与ca不等。所以是1i5子串abacab前缀a、ab、aba、abac、abaca后缀b、ab、cab、acab、bacab。最长相等是ab长度2i6子串abacaba前缀a、ab、aba、abac、abaca、abacab后缀a、ba、aba、caba、acaba、bacaba。最长相等是aba长度3所以按常见的“next[i]为前i个字符组成的子串的最长相等前后缀长度”定义有些书里叫部分匹配表PMT对于模式串abacabanext数组长度为7是[0, 0, 1, 1, 1, 2, 3]。如果是使用next[0] -1的版本一般定义为“失配时模式串跳转的位置”这样next数组会整体偏移结果是[-1, 0, 0, 1, 1, 1, 2]。所以考试时关键不是背一个固定的数组而是先确认卷面采用的定义。自己在写代码时也要注意这个坑不同教材的next数组含义不同有的表示“最长相等前后缀长度”有的直接表示“失配时的跳转位置”一个是数学定义一个是代码实现定义。实际手写KMP的时候我建议直接用统一模板vectorint getNext(const string p) { int n p.size(); vectorint next(n, 0); for (int i 1, j 0; i n; i) { while (j 0 p[i] ! p[j]) j next[j - 1]; if (p[i] p[j]) j; next[i] j; } return next; }这里的next[i]表示的是“以i结尾的子串中最长相等前后缀的长度”当p[i]失配时j回退到next[j-1]。匹配主串时类似int kmp(const string s, const string p) { int m s.size(), n p.size(); if (n 0) return 0; vectorint next getNext(p); for (int i 0, j 0; i m; i) { while (j 0 s[i] ! p[j]) j next[j - 1]; if (s[i] p[j]) j; if (j n) return i - n 1; } return -1; }KMP的核心思想是避免主串指针回溯利用模式串自身的重复结构来加速匹配。这个思想在字符串匹配类题目里非常高频而且后续要触类旁通比如Z算法、Manacher、AC自动机本质上都在利用“已匹配信息”来避免重复计算。2.2 常见排序算法与复杂度边界问题排序算法是另一道必考题。卷子里问了几种常见排序算法的最好、最坏、平均时间复杂度还追问了“快速排序最坏情况下如何优化”。先说基础的部分。冒泡排序、插入排序、选择排序的时间复杂度最好情况分别是O(n)、O(n)、O(n²)平均和最坏都是O(n²)。注意插入排序在近乎有序的数组上表现很好所以工程上经常用它作为高阶排序的base case比如Go语言里的pdqsort当分区规模小于一定阈值时就换成插入排序。快速排序平均O(n log n)最坏O(n²)。最坏情况发生在每次分区都选到极端基准值比如待排序数组已经有序而每次都固定取第一个元素作为pivot。优化手段有三个层次随机化基准值随机选一个下标作为pivot这样退化的概率降到极低。三数取中从首、中、尾三个位置取中间值作为pivot对抗近似有序的输入。三路快排把等于pivot的元素单独放中间区间适用于大量重复元素的场景。这个在很多排序题里是隐藏考点我见过不少同学在数据有大量重复时快排超时就是没有用三路快排。堆排序则是另一种O(n log n)排序它的特点是原地排序、最坏情况也是O(n log n)没有快排的退化风险但实际常数比较大。堆排序和快排的选择在业务排序场景里是个经典权衡需要稳定排序、内存敏感时可以考虑归并或堆排需要速度时快排通常更优。这一题想拿高分不能只写复杂度要能说明白“为什么”。面试官或者阅卷人想看到的是你理解快排退化的本质——分区极度不平衡导致递归深度退化到O(n)而随机化、三数取中、三路快排分别解决的是哪一类问题。2.3 动态规划与状态定义动态规划在算法卷里基本是压轴级考点。这次考了一道区间DP的题题目大意是给定一个房源序列每个房源有一个价值你需要选择若干房源组成一个推荐集合但是任意两个被选中的房源在序列中不能相邻目标是最大化总价值。这其实是经典的“打家劫舍”变体常规状态定义是dp[i]表示前i个房源中能获得的最大价值转移方程是dp[i] max(dp[i-1], dp[i-2] value[i])但卷子在原题上加了一个变化房源序列可以循环选择也就是第一个和最后一个房源也被视为相邻。这就需要把问题拆成两种情况不选第一个房源在[1, n-1]范围内做常规线性DP不选最后一个房源在[0, n-2]范围内做常规线性DP最终答案是这两个结果的最大值。这种“环形变线性”的思路在动态规划里非常经典类似的还有环形数组最大子数组和、环形石子合并等。解题的关键是意识到环形约束可以转化成两个线性子问题而不是真的去处理一个环形的状态转移。再看一道卷子里出现的“编辑距离”变形给定两个房源描述字符串允许增加、删除、替换一个字符问最少操作次数。这道题是标准的二维DP状态定义dp[i][j]表示字符串A的前i个字符转换成字符串B的前j个字符需要的最少操作数转移方程dp[i][j] min( dp[i-1][j] 1, // 删除A[i] dp[i][j-1] 1, // 在A后插入B[j] dp[i-1][j-1] cost // 替换若A[i]B[j]则cost0否则cost1 )这里有个实操注意点初始化不能漏。dp[i][0] idp[0][j] j因为一个字符串变成空串只能不断删除或插入。很多人笔试时初始化搞错导致整道题错得莫名其妙。动态规划题要做对核心就三件事状态定义对不对、转移方程能不能覆盖所有情况、初始化边界有没有搞清。做题时不要急着写代码先花两分钟把这三个问题想清楚比盲目开写效率高得多。2.4 粒子群算法与智能优化算法原理粒子群算法出现在原理题里其实挺出人意料的但仔细想想又不意外。房产估价、房源推荐这类场景里经常需要调参或者做特征选择粒子群这类启发式算法在工程上确实有落地空间。粒子群算法的核心是模拟鸟群觅食行为每个粒子代表解空间中的一个候选解粒子有位置和速度两个属性。每次迭代时粒子根据个体历史最优位置和群体历史最优位置来更新自己的速度再根据速度更新位置。速度更新公式是v[i] w * v[i] c1 * r1 * (pbest[i] - x[i]) c2 * r2 * (gbest - x[i])位置更新公式x[i] x[i] v[i]其中w是惯性权重控制粒子保持原有速度的程度。较大的w增强全局搜索能力较小的w增强局部搜索能力。很多工程做法是让w从0.9线性递减到0.4这样前期探索空间大后期收敛精细。c1、c2是学习因子分别控制向个体最优和全局最优学习的程度通常取2。r1、r2是[0,1]的随机数引入随机性避免陷入局部最优。面试或者笔试如果有问答题建议画一下算法的流程图然后按“初始化→评估适应度→更新pbest和gbest→更新速度和位置→判断终止条件”的顺序讲清楚。这里有个容易忽略的点速度需要限幅。如果不加vmax粒子可能直接飞出搜索边界导致数值溢出。实际应用中要设置速度上限并且处理边界约束——常见方式是边界吸收或边界反弹。模拟退火算法跟粒子群也经常一起考。模拟退火的核心思想是从一个高温状态开始随着温度下降以一定概率接受劣质解从而跳出局部最优。接受概率是exp(-delta/T)其中delta是当前解与候选解的目标函数差值T是当前温度。降温策略常用T T * alphaalpha取值在0.85~0.99之间。很多人在理解模拟退火时有个误区以为它一定能找到全局最优。实际上它只能以较大概率逼近全局最优而且对参数设定比较敏感。做题时如果考到“模拟退火和贪心的区别”核心答法是贪心只接受改进解容易陷入局部最优模拟退火在一开始能以一定概率接受劣质解随着温度降低接受劣质解的概率越来越小最终趋于稳定。这个“退火”的过程本质上是在探索和利用之间做一个动态平衡。3. 与业务场景结合的算法设计题实操复盘3.1 房源推荐场景中的序列建模问题卷子里有一道相对开放的题目给定用户最近30天的房源浏览序列每个房源带有若干标签如“近地铁”“精装”“学区”“朝南”等要求设计一个算法预测用户下一次可能点击的房源标签。拿到这种题第一反应肯定是上推荐系统的经典套路。但要注意的是这道题的限定条件是“序列”所以核心建模思路应该围绕序列模型展开。我当时的答题思路是第一明确问题的本质是多标签预测还是排序问题。如果只是预测用户最可能点击的标签可以建模成多标签分类如果是要给候选房源排序那更应该做成learning to rank的形式。笔试题不用真的实现全流程但要把自己的问题建模思路写清楚。第二特征工程是重点。围绕序列可以提取的特征包括浏览序列中房源标签的TF-IDF向量、统计特征最近3天偏好的标签分布、总浏览时长、平均停留时长、用户画像特征所在城市、购房目的、价格偏好、上下文特征当前时间、是否周末、设备类型。这些特征不是越多越好而是要考虑在离线和在线场景都可获取。第三模型选择。如果能拿到等长的序列输入可以考虑TextCNN或BiLSTM如果数据量不大完全可以从LightGBM和XGBoost入手把序列特征聚合之后做分类。这里要说明白一个点GBDT一类的树模型在特征离散化和非线性拟合上有优势而序列模型能自动捕捉时间依赖。实际业务里先把树模型作为baseline跑通再引入序列模型做增量是更稳妥的做法。第四评估指标。对于标签预测准确率、召回率、F1是基础但在推荐场景里我更推荐关注AUC和GAUC用户粒度AUC因为不同用户的点击率基线差异很大GAUC能更好地衡量排序质量。还有NDCG如果输出的是有序标签列表NDCG更能反映排序质量。最后要补一句AB实验设计的思路。算法上线前需要设计实验组和对照组实验周期一般是两周以上观察指标包括点击率、转化率、人均浏览时长等。这部分能写出来会明显提升整个答案的完整度。3.2 房源估价场景中的回归与特征选择还有一道题是关于房源估价的。给定一个房源的面积、楼层、朝向、装修程度、所在小区历史成交价、周边配套等特征要求设计一个估价模型。这个题一看就是回归问题。我当时的答题框架是第一步数据处理。房源数据里常有缺失值和异常值比如面积异常大的别墅和正常住宅混在一起楼层数不同的房源对比没有意义。我的处理策略是分类型变量做目标编码target encoding连续变量做分位数缩放缺失值用中位数或预测填充。楼层、朝向这类类别特征在树模型里可以直接label encoding但在线性模型或深度模型里需要one-hot或embedding。第二步模型选择。特征维度不算特别高但特征之间有较强的非线性关系比如面积和价格不是简单线性所以LightGBM和XGBoost是主力方案也可以用CatBoost处理类别特征。如果要更精细可以叠加一个神经网络做特征交叉。第三步损失函数与评估指标。估价回归问题的评估指标一般用MAPE平均绝对百分比误差和RMSE。这里有一个业务背景要理解对买家来说估价偏高比偏低更容易引起投诉所以实际产品里可能会对高估和低估分别设置不同的损失权重。这种“业务约束嵌入损失函数”的思路是校招卷里少有的能拉开分差的地方。第四步模型解释性。估价场景对解释性要求很高用户不会相信一个“黑盒”给出的价格。所以需要用SHAP值分析哪些特征对估价结果影响最大常见的结果是小区均价、面积、房龄、距地铁站距离是四个最重要的特征。这个结果也能反向指导数据采集——如果某个特征很重要但数据缺失就要优先补全。3.3 聚类算法在用户分群中的实际应用卷子里还有一个与聚类相关的题目给出一批用户的画像数据要求对用户进行分群并说明每个分群的特征和业务含义。这题的答题思路是第一步数据预处理。先做标准化因为不同的特征量纲差异很大比如年龄是0~100年收入可能是10万~1000万如果不标准化距离计算会被量纲大的特征主导。第二步算法选型。K-Means是最常用的聚类算法但需要指定K值。选择K值可以用肘部法elbow method看SSE随K变化的曲线拐点也可以用轮廓系数silhouette coefficient选择轮廓系数最大的K。这里我建议多说一句K-Means对初始中心敏感跑之前要设好n_init参数多次随机初始化取最优结果如果数据分布不是凸形的K-Means的效果会大打折扣这时候更适合用DBSCAN。第三步聚类结果的业务解读。算法给出聚类标签之后需要对每个簇做特征分布分析比如统计每个簇在“浏览偏好、价格敏感度、决策周期”上的均值然后人为总结成“刚需首套型”“改善置换型”“投资关注型”等标签。这一步没有标准答案但恰恰是业务算法工程师日常做得最多的工作——算法只负责聚类业务含义需要人来定义。这个题我想特别提一句很多同学写K-Means只会背流程但实际面试中被问到“K-Means的K怎么选”“如果数据量特别大怎么办”就答不上来。这两个问题是聚类题的高频追问点建议提前准备。数据量大可以用Mini-Batch K-Means或者用BIRCH解决内存瓶颈K值选不出来时可以用层次聚类先做一个粗分再决定K的范围。4. 笔试实战中的高频问题与避坑经验4.1 代码题常见低级错误校招笔试跟平时刷题不一样的地方在于没有IDE自动补全没有本地调试甚至有的平台不提供测试样例输出逻辑错了只能自己硬查。所以笔试中出现的问题很多不是不会做而是低级失误吃掉了很多分数。我总结几个高频翻车点第一边界条件处理不到位。数组题永远要检查空数组、单元素数组、相同元素数组、负数数组的情况。比如“最大子数组和”这道题如果数组全是负数标准Kadane算法需要特殊处理环形数组又得拆成两种场景。第二循环里改变迭代变量。写两层循环时内层循环里误改了外层循环的下标会导致死循环或者越界。这种错误在本地IDE里一跑就能发现但在笔试环境里特别难查。建议写循环时循环变量尽量用for (int i ...)不要用while手写自增。第三取模运算忘记加。数值很大时题目要求对1e97取模结果忘了在每次加乘运算后取模导致溢出。第四排序规则搞反。很多排序类题目需要自定义比较器比如按价格升序、按面积降序一旦比较器的返回值写反了整个结果就会反着来。写比较器的时候始终记住“返回true表示第一个参数排在前面”不然就在本地快速验证一个小例子。还有一种情况是题目要求输出满足某种条件的组合个数结果类别用int存不下需要用long long。这个也是面试中经常设置的陷阱尤其是动态规划计数题。4.2 原理题答题节奏与表述规范原理题看似简单但最容易出现“知道但说不清”的尴尬。比如问“KMP算法相比暴力匹配快在哪里”很多人只能答出“不用回溯主串指针”但更完整的答法是KMP利用next数组记录模式串自身的匹配信息匹配失败时跳过那些不可能匹配的位置从而把时间复杂度从O(nm)降到O(nm)。这个回答逻辑上包含三层快在什么地方、为什么可以这样快、代价是什么预处理next数组空间O(m)。我建议答题时采用“公式 例子 一句话总结”的结构。先写公式或伪代码再举一个具体例子走一遍流程最后用一句话点明算法核心。这样阅卷人扫一眼就能看到你的理解深度。另外原理题里如果考到算法复杂度不要只写大O最好分析下空间复杂度。比如“快排的空间复杂度是多少”很多人答O(1)严格说是O(log n)到O(n)因为递归调用栈空间也要算进去。4.3 时间分配与做题顺序贝壳这套算法卷的时间大概在90分钟到120分钟。我自己的做题策略是第一遍先把所有题都扫一遍按照“会做且快能做出来”的标准排序。先把这些分拿到手。第二遍做有把握但需要时间思考的题比如动态规划、区间DP这类留足时间推状态。第三遍剩下不会的题先把暴力解写出来至少保证能跑通小样例。很多笔试平台是按测试用例比例给分的暴力解能拿30%~50%的分数比空着强得多。我见过有些同学在算法原理题上花大量笔墨写了一大段最后代码题来不及做完。这里特别提醒代码题的占比通常比原理题高先保代码题再优化原理题。4.4 平台使用与答卷细节不同笔试平台的操作逻辑差异很大有的平台允许本地IDE有的只能在线编辑。建议提前在牛客网上模拟几次熟悉一下在线编辑的运行环境和输入输出模板。有些平台不支持#include bits/stdc.h要老老实实写全头文件这种问题虽然傻但真的影响心态。还有一个细节如果题目要求输出结果后不能有多余空格或换行在循环输出时要注意判断最后一个元素。这种格式问题在力扣上无所谓但在笔试平台可能直接被判WA。注意在线IDE的调试能力通常比较弱如果本地跑通但线上报错优先检查输入输出格式其次是数据类型长度最后才是算法逻辑。这三个原因按概率排序占了90%以上的“本地能过线上过不了”的情况。5. 从通用算法到业务落地的延伸思考5.1 索引与排序在搜索场景中的结合贝壳找房的业务核心之一是房源搜索搜索结果的排序直接影响用户体验。底层的倒排索引和排序算法在笔试里考察的是概念在业务里考察的是实时性和准确性之间的平衡。我在实际业务里做过一个房源搜索排序的优化当时面临的问题是用户每输入一个关键词要在几十万套房源里快速筛选出匹配项再按综合分排序。这个综合分是怎么算的它由基础分如售价、面积、户型和动态分如用户偏好、实时热度组成。如果用传统的先全量排序再取TopK性能撑不住但只靠倒排索引筛选出候选集合再做局部排序又可能丢结果。工程上常用方案是两层结构第一层用BM25算法做文本相关性粗排把候选集压缩到几百条第二层用学习排序模型精排。BM25的核心是词频和逆文档频率的加权组合而精排模型则需要引入用户行为特征。这个过程跟刷题时的排序算法完全是两个层次但内核是一致的——先缩小问题规模再做精细求解。5.2 强化学习在调价与推荐策略中的可能应用搜索热词里有“强化学习算法”贝壳的业务里也有它的应用场景。比如房源挂牌价的动态调整挂牌太久没成交的房源系统可以考虑提示房东适度调价但调价幅度不能太激进否则影响房东信任感。这个问题可以建模成马尔可夫决策过程状态是房源的基本属性和当前价格敏感度动作是调价幅度奖励函数是成交概率和成交周期的综合指标。但强化学习在真实业务里落地并不容易。首要问题是探索与利用的平衡——系统不能为了试探最优调价策略就拿真实用户和真实房源做实验。所以通用的做法是先离线训练一个模拟器用历史成交数据拟合用户响应模型再在模拟器里跑强化学习策略。这也是为什么算法岗的面试经常会问“某个策略怎么离线评估”这类问题本质上就是在考察你对RL落地的理解。5.3 机器学习与深度学习的选型逻辑热词里出现了“机器学习算法”“深度学习算法”这两者在校招笔试中通常以概念对比题出现。高频考点包括LR和SVM的区别、Bagging和Boosting的区别、Dropout的作用、BatchNorm的作用、Attention的原理等。我当时的复习策略是把常考概念做成一张对照表每个概念写清楚“是什么、解决什么问题、核心公式、典型应用”。比如L1正则化会迫使部分权重归零产生稀疏解常用于特征选择L2正则化只会让权重变小不会归零对离群点更鲁棒。Bagging通过有放回采样降低方差适合高方差模型如决策树Boosting通过串行训练降低偏差适合高偏差模型。Dropout在训练时随机丢弃部分神经元相当于训练多个子网络的集成测试时保留全部神经元但权重乘上保留概率。这些概念在笔试问答题里出现频率非常高。但如果只是背结论面试官深挖一句“为什么L1会让权重归零”就容易被卡住。理解“L1在0点有尖角梯度下降时更容易跨过0点”这个几何直觉比单纯背结论更稳。6. 算法笔试的备考建议与实用工具6.1 刷题路线与资料推荐如果你是准备贝壳这类互联网公司的算法岗刷题路线建议按以下顺序推进第一LeetCode Hot 100刷透。这是面试出现频次最高的题库覆盖了数组、链表、树、图、DP、贪心、回溯等核心考点。Hot 100不是刷一遍就够建议三遍第一遍建立解题框架第二遍总结题型套路第三遍限时模考。第二剑指Offer经典题过一遍。虽然现在题型更新很快但剑指Offer里的题在面试里依然高频尤其是链表、二叉树、栈和队列相关题目。第三针对意向公司做定制化补充。贝壳这类业务型公司会在算法之外更关注推荐、搜索、估价等场景所以除了LeetCode还要花时间看一些推荐系统、排序学习的基础资料。我自己用过的工具组合是LeetCode刷题 CodeTop查公司高频题 牛客网做真题模拟。CodeTop上能看到贝壳找房出现过的高频题列表针对性很强。牛客网用来熟悉笔试平台环境同时可以看其他人分享的笔试复盘信息量很大。6.2 手写代码的熟练度训练在线笔试最大的敌人不是不会做而是做得慢。解决慢的唯一办法是大量手写。这里说的“手写”不是指在IDE里敲代码而是指在无语法高亮、无自动补全的环境下写代码。平时练习建议直接用LeetCode网页版不开本地IDE不带自动补全强制自己徒手写代码。这样考场上的手感差距就会小很多。另外务必总结一套自己的常用代码模板。比如二分搜索的模板、并查集的模板、Dijkstra的模板、Trie的模板把这些模板写到烂熟于心。笔试时遇到变形题先在模板基础上改速度和准确率都会提升不少。我整理模板时有一个习惯每个模板都写清楚“这道模板解决什么问题、典型例题是什么、易错点在哪里”。这样复习的时候不是死记硬背而是带着问题去用。6.3 状态管理与心态调整算法笔试的时间窗口通常只有一个多小时遇到不会的题很容易心态崩。我的经验是遇到难题先深呼吸把题目条件写在草稿纸上用一个小例子手推一遍往往能打开思路。如果推了五分钟还没思路果断跳过先做后面的题。考前一周不要开新题了重点做两件事一是把模板重新默写一遍二是把错题本过一遍。错题本不是抄题目而是记录“当时为什么错、正确思路是什么、下次遇到同类题该注意什么”。这个习惯比刷十道新题都管用。最后笔试前一定要吃早饭、提前调试好摄像头和网络环境。这个听起来很基础但每年都有同学因为环境问题影响了考试状态实在可惜。7. 写在最后的一点个人体会复盘整套贝壳找房2023届校招算法卷2我个人最大的感受是这份卷子其实在向候选人传递一个信号——算法工程师不是纯粹刷题机器而是要用算法解决真实业务问题的工程师。试卷里的每个题目都能在贝壳的业务场景里找到影子。房源匹配搜索、估价回归、用户分群、推荐序列建模这些都是算法团队日常要面对的课题。所以如果你正在准备贝壳或其他业务型公司的算法岗建议把学习重心从“刷了多少题”转向“能不能把一道题跟一个业务问题连接起来”。刷题是手段理解算法背后的原理和边界才是目的。有一个小技巧可以分享平时刷题后主动问自己三个问题——这道题用到的算法还能用在哪里这个算法的瓶颈是什么如果数据量扩大一百倍算法还成立吗这三个问题想清楚了比多刷二十道题更有价值。
返回列表