
这套题不聊透可惜了。贝壳找房2023届校招算法卷3我前后帮几个学弟学妹做过复盘也跟猎头、HR朋友对过信息。先给结论这套卷子不是传统的纯刷题卷它更像一张“业务向算法卷”一边考你能不能写代码一边考你懂不懂交易撮合平台背后的算法逻辑。贝壳的业务本质是居住领域的交易撮合房子、用户、经纪人、线下服务链条这些都是算法可以切入的场景。搜索推荐、房价评估、供需匹配、画像分层、风控识别甚至线下的智能硬件数据都有可能成为题目背景。这篇文章我不讲题目本身的对错答案因为具体试卷内容有保密约定网传版本也真假混杂。我把这套卷子背后的命题逻辑、考点画像、典型题型的解题套路以及我见过的同学踩坑实录全部拆开讲一遍。不管你是准备2023届补录还是为下一年校招提前备战这套分析都适用。1. 这套卷子到底在考什么贝壳算法校招的命题逻辑1.1 先说结论这是一张“业务向算法卷”不是单纯刷题卷很多同学一听说“算法卷”第一反应是LeetCode刷题第二反应是“手撕红黑树”。但贝壳这种体量的公司算法工程师招进去是要直接面对业务问题的。房产交易撮合平台的核心矛盾是什么是“人-房-经纪人”三者之间的匹配效率和信任问题。搜索一道房源关键词要怎么把最可能成交的房子排到前面一个新小区的价格要怎么评估一个用户看了五套房还没下单系统要不要给他推一个更能打动他的经纪人或房源这些都是算法岗日常要面对的问题。所以这套卷子的命题逻辑很清晰基础算法考察的是下限确保你有编程底子和逻辑能力机器学习与业务场景结合题考察的是上限看你能不能把模型问题转化为业务价值。从几个参加过笔试的同学反馈来看试卷大致有三个板块客观题选择题加简答覆盖数据结构、机器学习、深度学习基础、编程题手写代码考察字符串、图论、DP等经典问题、场景设计题给一个业务背景让你设计方案。我拿到的信息里编程题占比不低至少两道场景题也有一道分值还不小。1.2 从考点热词看这套卷子的技术画像很“杂食”把搜索热词里的算法词拉出来看能发现一个很有意思的现象KMP、排序算法、Dijkstra、贪心算法这些是经典数据结构题属于“保分题”KNN、聚类算法、BM25、XGBoost、异常检测这些是机器学习题属于“业务基础题”卡尔曼滤波、PID算法、Sobel算法、音频重采样、粒子群算法、模拟退火这些出现在同一张卷子里很多人会被打懵。我解释一下为什么会出现这些貌似冷门的词。贝壳的业务不只是App和网站它还有大量线下和IoT场景。智能门锁、工地传感器、室内定位、智能家居设备这些硬件数据需要信号处理和状态估计算法卡尔曼滤波就是干这个的。PID调节在智能设备控制里是标配MPPT和FOC常见于新能源和电机驱动。至于音频重采样贝壳有大量的VR看房、语音咨询、房源语音描述音频处理是内容算法团队的一部分工作。这套卷子实际上在传达一个信号我们算法团队的业务边界很宽你最好是个“杂食性动物”。2. 数据结构与基础算法笔试的“保命分”2.1 字符串与模式匹配KMP的next数组到底考什么KMP是校招笔试里的“钉子户”这套卷子也没绕过。热词里那句“对于模式串pabacaba其next数组”就是典型的考法。这里要特别提醒你next数组的定义在不同教材里有两种口径很多同学就是栽在口径不一致上。第一种口径是“最长相等前后缀长度”即next[i]表示模式串前i个字符组成的子串中最长的相等前缀和后缀的长度不包含子串本身。按这个定义模式串“abacaba”的next数组是[0,0,1,0,1,2,3]我手算给你看前1个字符“a”没有真前后缀长度为0前2个“ab”前缀“a”和后缀“b”不等0前3个“aba”前缀“a”和后缀“a”相等长度1前4个“abac”没有0前5个“abaca”前缀“a”和后缀“a”相等长度1前6个“abacab”前缀“ab”和后缀“ab”相等长度2前7个“abacaba”前缀“aba”和后缀“aba”相等长度3。第二种口径是“失配跳转位置”即next[i]表示当第i位失配时模式串指针应该回退到的下标。这种定义下next数组通常整体往右平移一位且next[0]记为-1。如果你在笔试时看到题目明确给出了next[i]的定义就按题目的来如果没给默认先按最长相等前后缀长度处理并且在答题时把你的口径写清楚让阅卷人能看懂。再给一个最常用的next数组计算代码Python版本笔试现场默写这个基本不会错def get_next(p): n len(p) nxt [0] * n for i in range(1, n): j nxt[i - 1] while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j return nxt要注意的是KMP的匹配主循环里一旦j等于模式串长度说明匹配成功这时候要统计出现次数或返回下标就得让j回退到nxt[j-1]而不是清零。这个细节很多人现场写崩。2.2 图论与搜索Dijkstra堆优化、二分图HK、拓扑排序Kahn这套卷子的图论题从来不考裸模板而是套业务背景。比如说“经纪人带看路线优化”本质上就是单源最短路再比如“房源标签与用户偏好的最大匹配”就是二分图匹配。Dijkstra堆优化是必须烂熟于心的模板它的核心思想是每次从优先队列里取出当前距离最小的节点松弛它的邻居复杂度是O((VE)log V)比朴素版O(V^2)快得多尤其是在边多的稀疏图里。import heapq def dijkstra(graph, start): n len(graph) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: nd d w if nd dist[v]: dist[v] nd heapq.heappush(pq, (nd, v)) return dist二分图匹配里如果数据范围大匈牙利算法O(VE)可能扛不住HK算法Hopcroft-Karp能优化到O(E√V)。它的思路是把匈牙利算法的单次增广改成多次增广用BFS分层、DFS找增广路同时处理多条路径。普通校招能写对匈牙利已经不错如果你能把HK的思想讲清楚在场景题里会是加分项。Kahn拓扑排序则常用于有依赖关系的任务规划比如“带看流程的依赖检查”。核心是不断把入度为0的节点入队删掉它们的出边最后如果队列为空但节点还没处理完就说明有环。这里有个很容易忽略的坑入度数组要用queue记录处理完一个节点要记得把所有邻居的入度减1如果减到0就入队。2.3 排序与效率快排、堆排、冒泡选型逻辑才是考点排序算法在热词里出现频率极高说明这套卷子的客观题会给不少排序相关的选择题或简答题。最常见的考法是给一组数据问你“快排第一趟的结果”或者“堆排序建堆后的数组是什么样”再进阶一点就是“这三个排序哪个不稳定为什么”。我的建议是别死记结论而是理解三个关键维度时间复杂度、空间复杂度和稳定性。快速排序平均O(n log n)最坏O(n^2)不稳定原地排序递归栈除外胜在常数小堆排序严格O(n log n)不稳定原地排序但常数大实际运行往往不如快排冒泡排序O(n^2)稳定适合小规模数据面试里主要是考理论基础而不是真让你用它。笔试时如果遇到“大规模无序数据排序选什么”优先考虑快排变种比如三路快排能有效处理大量重复元素。顺便说一句热词里的“快速幂算法C”不是排序但它也是高频手写题尤其是求a^b mod m这种。快速幂能压到O(log b)核心思路是把指数拆成二进制边乘边模防止溢出。typedef long long ll; ll pow_mod(ll a, ll b, ll m) { ll res 1; a % m; while (b 0) { if (b 1) res (res * a) % m; a (a * a) % m; b 1; } return res; }2.4 贪心与动态规划算法卷的“分水岭”如果说排序和KMP是保分题那贪心和DP就是拉开差距的题。这类题的分值高而且经常出现在编程题的后半段考察的是你把业务问题抽象成数学模型的功力。典型贪心模型有区间调度活动安排、背包类分数背包、哈夫曼编码、任务调度最小化等待时间等。贪心题的难点在于证明局部最优能推出全局最优笔试阶段你只要会做、能讲清楚思路即可不需要严格写证明。动态规划考得最多的还是线性DP、背包DP和区间DP。核心是三步定义状态、写出转移方程、确定遍历顺序。以最经典的01背包为例状态dp[i][j]表示前i个物品放进容量为j的背包的最大价值转移方程是dp[i][j] max(dp[i-1][j], dp[i-1][j-w[i]] v[i])然后可以滚动数组压到一维。笔试的时候状态定义不要刻意追求炫技能用二维写清楚就用二维优化放到后面再说最重要的是让阅卷人一眼看懂你的思路。3. 机器学习与优化算法贝壳算法的“业务底色”3.1 搜索与相关性BM25为什么比TF-IDF更像个“老油条”贝壳是强搜索场景的平台用户搜“三居室 朝阳 地铁房”系统必须从海量房源里找出最相关的。这个环节拼的就是文本相关性算法。热词里的BM25是目前业界最常用的相关性打分函数之一它在TF-IDF的基础上做了三项改进词频饱和度控制、文档长度归一化、可调参数平滑。BM25的公式可以拆开看对查询词q中的每一个词t计算它和文档d的相关性得分然后累加。词频部分用tf(t,d)除以tf(t,d)加k1乘以长度归一化因子这样即使一个词在文档里出现很多次得分也不会无限增长。IDF部分还做了平滑避免某个词在所有文档都出现时IDF为负。理解这一层的价值在于如果场景题让你设计一个房源搜索排序方案你起码能说出“为什么不能只用简单的关键词匹配”这是从“会调包”到“懂原理”的分水岭。3.2 无监督与基础模型聚类、KNN怎么用进业务聚类算法在贝壳的典型应用场景是用户分层和房源分桶。K-means是最经典的无监督方法它的流程很固定随机初始化K个中心计算每个样本到中心的距离并划分到最近簇重新计算每个簇的中心重复直到中心不再变化。它的问题是K值需要预先给定而且对初始中心敏感实际工程里常用K-means做初始化用肘部法则或轮廓系数选K。如果考到“如何给房源聚集区域做热力分析”本质就是空间聚类。KNN则是“懒惰学习”的代表它不训练模型预测时直接找离测试样本最近的K个训练样本投票或加权平均。热词里提到“KNN算法的应用能力包括哪三个方面”我理解是分类、回归和异常检测。更关键的是它有三个要素K值选择、距离度量欧氏、曼哈顿、余弦、决策规则。在贝壳里KNN可用于二手房估价中的“相似房源检索”——找到和目标房源最相似的K套已成交房源用它们的成交价做加权平均。3.3 传统优化与元启发式粒子群、模拟退火为什么会被考到热词里出现“粒子群算法原理”和“模拟退火算法”很多只会深度学习的人看到会发懵。这两类算法属于元启发式优化专门解决传统梯度下降搞不定的问题比如组合优化、参数调优、路径规划。粒子群算法的灵感来自鸟群觅食。每个解被看作一个粒子它有位置和速度两个属性每次迭代根据自身历史最优位置pBest和群体历史最优位置gBest来更新速度和位置。速度更新公式里有两个关键项c1和c2分别是自我认知和社会认知系数r1和r2是随机数让算法具备随机探索能力。简单说就是“每个粒子一边回忆自己最好的位置一边向群体最好的位置靠拢同时保留一定惯性”。模拟退火则是模仿金属退火过程。它从高温开始随机产生新解计算能量差ΔE如果ΔE小于0就接受新解如果ΔE大于0就以概率exp(-ΔE/T)接受一个更差的解温度T越低接受差解的概率越小。这个“允许偶尔接受差解”的设计是为了跳出局部最优。在笔试遇到这类概念题你不需要把公式推导全背下来但至少要能把这个粗线条逻辑讲清楚特别是“为什么元启发式算法擅长跳出局部最优”这个问题。3.4 从XGBoost到工业异常检测经典ML在风控和质检中的实战热词里既有“XGBoost算法”也有“工业异常检测算法”这俩在贝壳的业务里都很有存在感。XGBoost是GBDT的工程化加强版它在每一轮迭代中都拟合上一轮预测的负梯度残差同时加入正则项控制模型复杂度防止过拟合还用二阶泰勒展开加速收敛。做搜索排序、转化率预估这类表格型特征任务XGBoost或LightGBM依然是工程上的首选因为训练快、效果稳、可解释性比深度模型强。工业异常检测在贝壳这里的场景可以是设备传感器异常报警、签约流程中的欺诈行为识别、异常点击流量识别。异常检测的难点是正负样本极度不均衡正常样本占绝大多数异常样本可能只有百分之一甚至千分之一。常用的思路有基于统计的阈值检测、基于隔离森林等无监督方法、基于XGBoost的有监督分类以及深度自编码器重建误差检测。回答这类问题的时候一定要先说清楚“用什么特征、用什么模型、怎么评估”而不是空谈模型名称。4. 深度学习、信号与多模态扩展考点贝壳卷里“非主流但重要”的题目4.1 图像处理基础Sobel算子和拉普拉斯锐化的“底层逻辑”热词里出现“图像锐化的拉普拉斯算法”和“Sobel算法”这大概率是客观题里的一道图像处理题。Sobel算子是边缘检测算子它用两个3x3卷积核分别计算水平方向和垂直方向的梯度近似值梯度幅值大的地方就是边缘。它的核心是“用差分近似微分”图像的边缘是灰度剧烈变化的位置而灰度变化可以用梯度来度量。拉普拉斯锐化则是用二阶微分算子它的卷积核通常是中心为4或8、周围为-1或0的3x3核。锐化的本质是原图减去或加上拉普拉斯算子处理后的细节层让边缘对比更强。你可以理解为“原图上直接叠加它的高频分量”。如果笔试只背公式很容易忘记这两个算子的本质区别Sobel求一阶导用于检测边缘位置和方向拉普拉斯求二阶导对噪声更敏感但能同时检测各个方向的边缘不需要像Sobel那样分水平垂直两次。万一考到“能不能先用高斯滤波再求梯度”答案是可以而且这是实战中的标准操作这就是Sobel的进阶版——先平滑降噪再求梯度能有效避免把噪声误判为边缘。4.2 时序估计与状态融合卡尔曼滤波为什么是硬骨头卡尔曼滤波在硬件和感知算法中太常见了而贝壳有大量IoT设备和线下场景数据室内定位、移动轨迹、传感器数据融合都可能用到卡尔曼滤波。它的数学表达看着吓人但本质只有两步预测和更新。预测阶段用状态转移方程F和上一时刻的状态估计预测当前时刻的状态和协方差P更新阶段用观测值z和观测矩阵H计算残差实际观测量减去预测观测量再用卡尔曼增益K加权融合预测值和观测值。卡尔曼增益K是一个0到1之间的权值观测噪声小、K就大更信任观测观测噪声大、K就小更信任预测。笔试中如果考到卡尔曼滤波多半是让你写出预测和更新方程或者结合轨迹平滑/传感器融合场景解释它的作用。不需要现场推导公式但你需要能指出“卡尔曼滤波适用于线性高斯系统”这个前提以及“如果系统是非线性的就要用扩展卡尔曼滤波或无迹卡尔曼滤波”。这句话一出来懂行的人就知道你是真的理解了而不是背过公式。4.3 强化学习与深度模型前沿考点怎么准备热词里有“强化学习算法”和“EVA-02分类算法”这代表这套卷子会兼顾深度学习的经典与前沿。强化学习的基本框架是智能体与环境交互状态s、动作a、奖励r、策略π目标是最大化累计奖励。经典算法从Q-learning到DQN核心都是用Q函数估计“在某个状态采取某个动作的价值”DQN用神经网络拟合Q函数并引入经验回放和目标网络来解决样本相关性和训练不稳定的问题。如果笔试考到“RL在推荐系统里怎么用”你可以回答把用户每次曝光推荐看作状态推荐物品是动作用户的点击/购买行为是奖励然后用策略梯度或DQN做长期收益优化。EVA-02这类视觉Transformer模型代表的是最近的视觉模型趋势。它基于ViT架构把图像切patch用Transformer编码器做分类。这里你不必把每个模块结构背得滚瓜烂熟但至少要能说清楚“ViT和CNN的区别在哪里”CNN靠卷积核做局部特征提取ViT靠自注意力机制建模全局依赖关系在数据量足够大的情况下ViT的上限往往更高。4.4 为什么会出现音频重采样、PID、MPPT、FOC、Rete这些“冷门词”我见过不少同学看到这些词直接心态崩了。别慌这类题在客观题里占比不大而且考得都很基础通常是“这个概念是干什么的”或者“以下哪项是某某算法的用途”这种形式。音频重采样解决的是采样率不统一的问题比如语音识别模型要求16kHz采样率但录音设备输出的是44.1kHz这时候就要做重采样常见方法有线性插值、多相滤波等。PID是比例-积分-微分控制器的缩写用于智能家居温控、机器人电机控制等场景公式是u(t)Kp·e(t)Ki∫e(t)dtKd·de/dt。MPPT是光伏系统中的最大功率点跟踪FOC是电机控制的磁场定向控制这俩和算法岗位的关联点在于“控制类算法岗位”或“硬件数据算法岗位”。Rete算法是规则引擎Drools的核心匹配算法它用网络结构缓存匹配结果避免每次事实插入都全量重算适合大量规则与事实匹配的场景。我的建议是遇到这类题能做就做做不出来不要恋战把时间留给后面的编程题和场景题这是考试策略也是人生策略。5. 实操模拟三道有代表性的题目带你走一遍解题流程5.1 编程题模拟字符串循环移位匹配KMP实战这道题是我根据贝壳卷的考点风格模拟出来的不是原题但很能代表这套卷子的出题偏好。题干是这样的给定两个字符串A和B长度相等判断B是否可以由A循环移位得到。比如AabcdeBcdeab答案是TrueBcdeba答案是False。思路非常经典把A拼接成AA那么A的所有循环移位结果都包含在AA里于是问题转化为“B是否是AA的子串”正好用KMP解决。注意一个边界条件如果A和B长度不等直接返回False如果A为空串返回A等于B。def get_next(p): n len(p) nxt [0] * n for i in range(1, n): j nxt[i - 1] while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j return nxt def kmp_search(text, p): nxt get_next(p) j 0 for i in range(len(text)): while j 0 and text[i] ! p[j]: j nxt[j - 1] if text[i] p[j]: j 1 if j len(p): return True return False def is_rotate(a, b): if len(a) ! len(b): return False if len(a) 0: return True return kmp_search(a a, b)这道题之所以经典是因为它用了一个非常巧妙的转化把循环移位问题变成了子串匹配问题。现场写代码的时候记得先在草稿纸上写出next数组的推导过程再写主函数这样代码写出来是顺的。我最常看到的问题是有人忘记处理空串或者直接把字符串拼接后调库函数find虽然调库也能过但面试官想看你手写KMP的能力能写就尽量别偷懒。5.2 场景题模拟房源列表竞价排序贪心约束场景题是贝壳卷里最有区分度的部分。我模拟一道典型的假设平台上有N套房源每套房源有一个基础质量分s以及一个经纪人提报的竞价金额p平台最多只能挑选M套房源进入首页推荐位每个推荐位的曝光转化率不同按坑位递减。问如何选品使得总收入最高这个问题看起来像贪心但其实是个组合优化问题。最简单的情况是如果每个房源不管放在哪个坑位转化率都一样那就按“竞价金额从高到低”选出M个就行但如果坑位有差异最优方案要计算每套房源在某个坑位的期望收益做指派问题。笔试现场如果遇到这种场景题不要直接上手写代码先明确约束推荐位数量M、每套房源只能占一个坑位、转化率是否固定、是否要兼顾平台生态指标比如不能让低质量房源霸屏。我建议的答题框架是先说问题建模再说算法选型最后给一个可落地的简化方案。比如先按“质量分门槛”过滤掉不合格房源再用贪心按“竞价金额高且质量分达标”排序或者用KM算法做最大权匹配。阅卷人不会要求你一定写到最优解但会很看重你的思路是否结构化以及你对业务约束的感知力。5.3 机器学习简答模拟如何设计一个房产搜索相关性排序方案这道模拟题的开放程度很高也是贝壳这类公司最爱考的题型。我给一个高分答题模板先说整体链路召回、粗排、精排、重排再分别填充细节。召回层用BM25做文本召回配合布尔过滤户型和价格区间再叠加向量召回用预训练模型把查询和房源标题编码成向量拿余弦相似度召回TopK。粗排层用轻量模型如双塔或LR把召回的上万结果压缩到几百。精排层用XGBoost或Transformer排序模型特征包括文本相关性、房源质量分、经纪人在线状态、价格偏离度、历史转化率。重排层考虑多样性别让同一小区的房源占满整个屏幕。评估指标也要提到离线指标用NDCG、MAP、RecallK在线指标看点击率、收藏率、约看转化率。最后加一句“还需要考虑冷启动房源和长尾查询的覆盖”就会成为一个结构完整、有业务感的回答。6. 常见问题与备战建议6.1 笔试现场最容易踩的坑我根据历届同学的复盘列一个高频坑清单没看清输入输出格式字符串题里有多余空格、换行导致解析错乱。校招笔试的输入用例通常很严格读题时先看输入范围再看有没有多组输入。边界条件不处理就提交比如数组为空、目标值不在数组中、字符串长度不相等、K0。这类边界用例往往占20%以上的分数。手写KMP时next数组和匹配主循环的指针回退写错回退时应该是nxt[j-1]而不是jnxt[j]一字之差整个程序就崩。图论题忘了处理自环和重边导致最短路算错。Dijkstra的堆优化里如果从堆里弹出的节点已被处理过要跳过。场景题里不使用纸笔直接开始写代码。先画流程、列公式、定复杂度再动手码效率高很多。还有一条特别重要时间分配。客观题里遇到不会的题先标记跳过别卡住。编程题如果第一道难先做第二道拿基础分最后回头再啃。校招笔试的目标是“通过”不是“满分”能拿的分先拿到手里。6.2 数据结构和算法准备清单结合百度热词里的高频词我整理一个笔试前的自查清单字符串KMP的next数组和匹配主循环能手写。排序快排、堆排、归并排序能说清楚复杂度、稳定性和应用场景。图论Dijkstra堆优化、拓扑排序Kahn、并查集看情况准备匈牙利或HK。树二叉树遍历前中后序、层序二叉搜索树的插入删除最低公共祖先。动态规划背包、最长递增子序列、最长公共子序列、区间DP。贪心区间调度、分饼干、跳跃游戏。数学快速幂、最大公约数、质数筛。这里不需要把所有题刷完每种类型做5到10道经典题做到能不看题解写出来比刷300道但每道都记不住有用得多。6.3 针对贝壳业务的准备建议如果你已经通过笔试、进入面试或者想为下一轮校招做准备我强烈建议你专门研究一下贝壳的业务场景而不是继续闷头刷题。贝壳的核心场景有三个无论如何都要准备第一个是搜索与推荐。手机App的房源搜索、首页信息流推荐、相似房源推荐都是算法岗的高频面试场景。你要能设计一个从召回、粗排到精排、重排的完整链路并解释每个环节的模型选型和指标。第二个是房价评估与估价模型。二手房估价是一房一价天然适合回归模型特征工程是关键户型、面积、朝向、楼层、小区均价、周边配套、历史成交价都是重要特征。面试时如果能主动提到“需要做特征交叉和缺失值处理”会加分不少。第三个是匹配与分单。经纪人、用户、房源之间的供需匹配是典型的运筹和匹配算法问题可以参考二分图匹配、最大权匹配、以及在线分配里的算法思路。还有一个容易被忽视的方向风控和反作弊。平台上有虚假房源、恶意刷单、异常流量异常检测、图模型、序列模型都在这个场景里有发挥空间。提前想好“如果让你识别虚假房源你会怎么做”比临时抱佛脚强一百倍。写在最后分享一点个人体会这套卷子给我最大的感受是贝壳的算法团队真的把“算法”当成解决业务问题的工具而不是笔试场上的装饰品。它既考你KMP这种基础功又考你BM25这种检索基本功还考你卡尔曼滤波这种硬件算法说明他们希望招进来的工程师能快速融入不同方向的业务组。所以我建议准备的同学别把时间全花在刷难题上多想一想“这个算法在真实业务里怎么用”这套思维会在笔试和面试里同时帮你加分。最后再分享一个小技巧做场景题时先写“问题定义”再写“方案设计”最后写“评估方式”。这个三段式结构模板能让你的答案看起来非常专业比写一堆零散的思路强得多。祝准备校招的你笔试顺利这套卷子没那么可怕但也绝不好糊弄认真准备会有回报的。