
2019年秋招那会儿我前后投了不少家和物流、电商、供应链相关的算法岗顺丰科技算是重点准备的一家。后来专门把当年顺丰科技运筹优化算法工程师的笔试客观题合集翻出来重新做了一遍发现这个合集的含金量比想象中高。题目没有特别偏门但覆盖面很广从线性规划、图论、动态规划到概率统计、机器学习基础、数据结构与算法几乎把算法岗笔试里最常踩的坑都埋了一遍。这篇文章就按这份合集的实际考查方向重新梳理把每类题背后的考点、解题思路和容易丢分的地方展开讲讲给准备物流科技、供应链算法方向的同学做个参考。1. 客观题合集到底考什么先拆掉这层“信息差”笔试和面试不一样它不要求你把每个知识点讲得多深但要求你在有限时间内快速判断“这个知识点我见过、我知道它是怎么回事”。运筹优化算法岗的客观题合集本质上就是在筛“基础扎实、反应快、细心”的候选人。如果连这些基本功都不过关后面的编程题和业务面试基本没戏。1.1 一份典型的物流科技算法笔试时间线顺丰科技这套2019秋招客观题考试时长通常控制在40到60分钟题型以单选、多选、判断、填空为主偶尔穿插少量简答或数学推导。客观题占比不小我记得当时大概有30到40道题覆盖的知识模块会明确分布在几个方向上运筹学基础线性规划、对偶、灵敏度分析、图论与网络优化最短路、最小生成树、最大流、匹配、动态规划、概率统计与随机过程、机器学习基础、数据结构与算法。有些题会以场景化的方式出现比如“某快递分拨中心每天处理N万票快件需设计车辆调度方案”“给定多个网点坐标和需求量求最优路径”这类题表面披着业务外衣实际考的还是经典模型。这里要提醒一句这类笔试多选题的计分规则往往是“少选得部分分多选错选不得分”所以做题策略上要保守一些。拿不准的选项宁愿不选也不要冒险多勾。判断题也容易埋伏笔很多同学看到前半句对就直接打勾结果后半句藏着一个“一定”“所有”“绝对”之类的绝对化表述整题全错。1.2 “运筹优化”这四个字在笔试里翻译成什么能力很多同学看到“运筹优化算法工程师”这个岗位名第一反应是“只要会数学建模和求解器就行”。实际上顺丰科技这类物流科技公司的运筹优化岗日常工作会涉及车辆路径规划、仓储网络布局、人员排班、价格策略、时效预测等多个流程每个流程都不是单纯的数学问题而是数学、算法、工程实现和市场环境的交叉。所以笔试客观题并不只考“运筹学”一本书它还会考察你作为算法工程师的基本素养。比如给一个线性规划模型问最优解在哪个顶点给一段代码问时间复杂度和空间复杂度给一个机器学习场景问该用哪种正则化手段防止过拟合甚至给一个排队论场景问平均队长怎么计算。这些都指向同一个能力要求能用数学语言描述业务问题能用算法思想拆解问题能在工程上落地解决问题。换句话说岗位叫“运筹优化”但试卷是按“算法工程师”的标准来出的数学、算法、代码基础三条腿缺一不可。2. 高频考点逐个拆线性规划、图论、动态规划一个都不能少客观题里最核心的部分永远是运筹学三件套线性规划、图论和动态规划。这三块内容在业务场景中对应的是资源分配、路径规划、流程决策也正是物流科技公司最依赖的算法能力。下面把常见考法拆开聊。2.1 线性规划与对偶、灵敏度分析客观题的固定嘉宾线性规划几乎是必考内容。常见考法有三种一是给一个具体模型让你判断可行域形状或最优解位置二是给原模型让你写出对偶模型三是考灵敏度分析比如某个资源系数在一定范围内变化最优解是否改变。以一道典型选择题为例考虑如下线性规划问题目标函数max z 3x1 x2约束条件为x1 x2 ≤ 42x1 x2 ≤ 5x1、x2 ≥ 0。问最优解落在哪个点上。这道题如果画图很快能得出可行域顶点分别是(0,0)、(0,4)、(1,3)、(2.5,0)代入目标函数后z值最大的是(2.5,0)z7.5。不过考试时间紧很多同学一上来就套单纯形表容易在迭代过程中算错。更快的做法是先看约束条件、找可行域顶点再比较目标函数值这一步一定要细心因为顶点往往不止两个漏掉一个就会选错。另一类高频题是对偶问题。很多同学记得“对偶问题的对偶是原问题”但写对偶模型时容易把约束方向和变量符号写反。这里有一个稳的写法原问题是max约束是≤变量非负对偶问题是min变量是原问题每个约束对应一个非负对偶变量对偶约束与原问题变量的系数矩阵转置相关。平时练习时可以把原模型和对偶模型写在一起对照养成检查习惯。灵敏度分析在客观题里考得比较浅通常只考“某个系数在什么范围内变化当前最优解不变”或“某项资源的影子价格是多少”。这类题真正的坑在松弛变量和剩余变量的处理上。影子价格对应的是约束资源的边际价值并不是单纯的目标函数系数。做这类题时一定要先分清资源约束是“≤”还是“≥”再决定用松弛变量还是剩余变量否则答案基本都会跑偏。2.2 图论与网络优化路径、最小生成树、最大流的几种考法图论在物流场景里非常高频因为物流本质就是“网络上的流动”。客观题里出现过的图论考点主要有四类单源最短路Dijkstra、全源最短路Floyd、最小生成树Prim和Kruskal、最大流与最小割。最短路的题比较容易识别。Dijkstra适用于无负权边的图复杂度是O(n²)如果用堆优化可以降到O(mlogn)。有负权边就得用Bellman-Ford或SPFA。客观题里面经常给一个五六个节点的小图让你手动跑一遍Dijkstra问某个点到目标节点的最短路长度。这类题一定要按顺序标记“已确定最短路的节点”避免把松弛关系搞混。我当年做这种题有个习惯在草稿纸上画出节点图每确定一个节点就给它的邻边做一次松弛然后把已确定的节点划掉避免重复计算。最小生成树的考法主要是区分Prim和Kruskal。Prim从点出发适合稠密图Kruskal从边出发先排序再并查集连边适合稀疏图。客观题会给一个小图问Kruskal按边权从小到大连接时第几条边会被舍去。这里要小心环的产生每次连边前都要检查两端点是否已经在同一个连通分量里否则就会形成回路这也是经典的“避圈法”思维。最大流和最小割在笔试中通常以定理判断题出现比如“最大流的值等于最小割的容量”。这题很多人会背结论但实际题目会把最小割的定义换成“最小割集”容易混淆。记住一个关键点最小割是一组边的集合断开这些边后源点s到汇点t不再连通且这些边的容量之和最小这个容量和就是最大流的值。客观题如果给个小网络图手动跑一遍Ford-Fulkerson找出增广路一般就能算出最大流。顺丰物流场景里这类模型会和“运输网络最大通过能力”结合本质还是换皮题。2.3 动态规划从背包问题到状态转移的识别动态规划在客观题中出现频率很高而且经常会和代码题混在一起。常见的客观题形式是给一个状态转移方程让你判断时间复杂度或者给一个0-1背包的实例问最终最大价值和选择的物品组合。0-1背包是动态规划的“新手村Boss”。比如有5个物品重量分别为2、2、3、4、5价值分别为3、4、5、6、8背包容量为8问最大价值是多少。解题时先明确状态定义dp[i][j]表示前i个物品放入容量为j的背包能获得的最大价值。转移方程为dp[i][j] max(dp[i-1][j], dp[i-1][j-w_i] v_i)。手动填表时容量j从0到8逐步推进注意每一行只依赖上一行的数据所以空间可以优化成一维数组但一维数组内层循环必须倒序否则同一个物品会被重复选入变成完全背包。这就是客观题最喜欢埋的坑问“0-1背包内层循环为什么要倒序”答案就是避免重复选择。动态规划的客观题还会考“状态压缩”和“最长公共子序列”等变体。识别一个题是否属于动态规划可以从两个特征入手有重叠子问题、有最优子结构。如果一个问题满足这两个特征就可以尝试用动态规划如果不满足强行套状态转移只会算出一堆无用值。考试遇到这种识别题不要想着推导完整过程先看能不能分成互不重叠的阶段再看每个阶段的决策是否依赖之前的结果一般就能判断出来。3. 混合型知识点概率与随机过程、机器学习、数据结构的三方交叉顺丰科技这套客观题合集比较有特点的地方在于它不只考运筹还混入了概率、机器学习、数据结构相关的内容。这说明算法工程师岗位的笔试已经越来越“混科化”单一学科知识已经不足以支撑业务落地。3.1 概率论与随机优化排队论在物流场景里的现身物流系统里随机性无处不在快件的到达时间、中转场处理时间都有波动所以排队论是运筹优化岗笔试的高频考点。最常考的模型是M/M/1排队系统即顾客到达间隔服从泊松分布到达率λ、服务时间服从指数分布服务率μ、单服务台。M/M/1的关键公式要记住几个系统利用率ρλ/μ这个值必须小于1系统才会稳定平均队长L ρ/(1-ρ)平均等待时间W L/λ 1/(μ-λ)。客观题经常这么出某分拣线平均每小时到达60件包裹分拣机每小时能处理80件求系统利用率和平均等待时间。这道题把单位统一成小时λ60μ80ρ60/800.75L0.75/0.253件W3/600.05小时3分钟。这里最容易错的点有两个一是单位没统一分钟和小时混用二是把平均等待时间直接当成平均逗留时间。排队论里平均逗留时间还包括服务时间公式是1/(μ-λ)3分钟如果是指从到达到处理完的总时间那和平均等待时间的区别一定要分清。除了排队论概率题还会考条件概率、贝叶斯公式、期望计算。比如给两个快递员甲处理快件错误的概率是0.01乙是0.02各处理一半的快件问“如果发现一个错件是甲处理的可能性有多大”。这就是典型的贝叶斯题P(甲|错)0.5×0.01/(0.5×0.010.5×0.02)1/3。这类题在客观题里属于送分题但前提是把事件定义写清楚不要搞反条件。3.2 机器学习与统计基础被混进运筹卷子的送分题运筹优化岗位卷子里出现机器学习题很多人会意外但我反而觉得这是正常的筛选逻辑。现在做物流算法单靠纯运筹模型已经不够了需求预测、时效预估、异常检测场景都需要机器学习模型。所以客观题里会顺带考一些机器学习基础但深度不会超过“概念辨析”的范畴。常见考点包括过拟合与欠拟合的区分、正则化手段、交叉验证、偏差与方差权衡、L1和L2正则化的区别、随机森林与GBDT的差异。这类题只要复习过都能答但有一些细节容易踩坑。比如L1正则化倾向于产生稀疏权重L2正则化倾向于让权重趋近于0但不会等于0随机森林通过Bagging降低方差GBDT通过Boosting降低偏差交叉验证的主要目的是让模型评估更稳定而不是直接提升准确率。客观题经常把这几组概念交叉配对如果只记得“L1是绝对值的和、L2是平方和”而不理解作用看到“L2正则化能让某些权重变为0”这种选项时就会误选。还有一类题跟运筹结合得更紧密比如“在需求预测场景中样本不均衡如何处理”选项通常是“过采样、欠采样、调整损失函数权重、直接删掉少数类样本”。直接删样本不是处理不均衡的常规做法丢掉信息会导致模型更差。这类题的解题逻辑不是背结论而是代入业务“如果我是这个场景的算法工程师我该选哪种方案”。3.3 数据结构与算法复杂度基本功不能瘸腿数据结构与算法是算法岗笔试的“免检项”无论你投的是运筹优化岗还是机器学习岗都会考。客观题主要集中在几个方向排序算法的复杂度与稳定性、KMP算法next数组的计算、哈希表的冲突处理、二叉搜索树与B树的区别、二分查找的边界问题。排序算法复杂度可以用一个口诀快速回忆冒泡、选择、插入三个简单排序平均O(n²)其中插入排序在近乎有序的数组上表现很好归并排序O(nlogn)且稳定快速排序平均O(nlogn)但不稳定堆排序O(nlogn)也不稳定。客观题会问“以下哪个排序算法是稳定的”这时候要很明确只有冒泡、插入、归并、基数排序稳定。另一个高频考点堆排序的空间复杂度是O(1)归并排序的空间复杂度是O(n)快速排序的递归调用栈空间平均是O(logn)最坏是O(n)。这些都是客观题的经典送分点但错误率一直不低。KMP算法在客观题里通常给一个模式串让你算next数组。以热词里的模式串“abacaba”为例next[i]通常定义为第i个字符位置的最长相等前后缀长度具体定义不同教材有差异。计算时要先写出模式串下标然后逐步比较前缀和后缀遇到不匹配就回溯到上一个next值。kmp考的是耐心不是技巧动笔算两遍跟心算完全是两种准确率。4. 典型客观题真题复盘题目长什么样为什么选这个答案只看知识点框架还是太抽象不如直接看几道有代表性的客观题按考场上的思路复盘一遍。这里的题目不是原题但题型、选项结构和易错点跟合集里的题目高度一致。4.1 选择题示例与排除法思路先说一道图论相关选择题“关于Dijkstra算法下列说法正确的是”。选项大概是A. 可以求带负权边的单源最短路B. 每次从未访问节点中选择距离最小的节点进行松弛C. 时间复杂度一定是O(n²)不能通过堆优化D. 能求所有点对之间的最短路。正确答案是B。A错在对负权边无效C错在可以用优先队列优化到O(mlogn)D错在Dijkstra只能求单源最短路要求全源需要运行n次或使用Floyd。这类题有个很实用的排除法遇到算法适用条件类的选择题先看有没有“一定”“只能”“任何”这类绝对词再看算法本身的已知性质。Dijkstra不能处理负权边、只能求单源、可以用优先队列优化这三个性质只要有一个想清楚选项就能逐条排除。再来看一道线性规划选择题“线性规划问题如果有最优解则最优解一定出现在可行域的顶点上”。这题本质是考线性规划的基本定理答案是对的但很多同学为了求稳会把这种描述翻译成“只有顶点才能取到最优解”这就错了。如果一个线性规划的最优解出现在两个顶点连线上的任意点那么这两个顶点也是最优解。所以严谨的表述是“存在一个最优解在顶点上”而不是“所有最优解都在顶点上”。选择题如果题干改成“如果线性规划存在唯一最优解那么最优解一定在顶点上”那也正确如果没加“唯一”很容易埋“有多重最优解”的坑。4.2 判断题的“坑”和高频埋雷点判断题是客观题里最考验细心的题型因为要么全对要么全错没有中间分。我见到的错误率最高的几类判断题几乎都有共同特征前半句是常规结论后半句突然加一个绝对化限定。比如“在整数规划问题中线性松弛得到的最优解取整后就是原问题的最优解”这个判断是错的。整数规划松弛解取整不一定可行即使可行也不一定最优这是分支定界法存在的原因。很多同学觉得“取整”离最优解很近就直接打对但恰恰是这种直觉害了自己。再看“最小费用最大流问题中如果网络中存在多条最大流则最小费用流唯一”这也是错的最小费用流也可能有多条只是费用相同。判断题还有一个坑把充分条件和必要条件混在一起。例如“一个矩阵如果所有顺序主子式都大于零则该矩阵是正定矩阵”这个条件其实是正定的充要条件之一表述没有问题但如果题目改成“正定矩阵的每个元素都大于零”那就错了。做题时要把“充分性”和“必要性”都默念一遍不要被熟悉的结论带跑。4.3 填空题与简答题的踩分要点填空题往往考公式记忆和关键结论。比如“M/M/1排队系统中系统利用率ρ要使系统稳定需要满足条件”。这属于直接送分但填的时候要注意单位。如果题目给了到达率λ5人/分钟、服务率μ6人/分钟那ρ5/6如果服务率写的是6人/小时而到达率是5人/分钟就必须把单位统一成同一时间尺度再计算。简答题在客观题合集里不算多偶尔会有“简述分支定界法的基本思想”“用一句话解释互补松弛定理”这类。答题时不要写太长也不要用无关的套话直接写核心逻辑。分支定界法的关键是“分支”和“定界”两个动作分支是把问题按变量取值拆成若干子问题定界是通过松弛解估计上下界来剪枝减少搜索空间。写清楚这两点就能拿分不用展开太多。5. 备考策略与时间分配一个月如何从零刷题到上场不慌客观题合集的价值不在于“知道答案”而在于用它来检验知识框架。如果你现在才开始准备这类笔试一个月时间是足够的但必须把有限时间花在回报率最高的模块上。5.1 按知识点划分优先级的三轮复习法第一轮花10天左右把基础概念过一遍。重点是线性规划的对偶与灵敏度、图论最短路/最小生成树/最大流、动态规划的几个经典模型、M/M/1排队公式、机器学习常规概念、排序算法与KMP。这轮不用大量刷题但要把每个知识点的定义、公式、适用条件搞清楚可以用笔记本把易混淆的结论列成表格。第二轮花10天刷题。刷题对象除了这份顺丰科技合集还可以找其他物流科技公司或互联网公司的算法工程师笔试题。刷题时不要只对答案要把每道错题的知识点回归到第一轮的笔记上标记“易错点”。我当年会把错题按“概念不清、计算失误、读题不仔细”三类分类这样二刷时效率会高很多。第三轮花最后的5到7天做模拟。重点是限时训练按正式考试的节奏来做整套题。模拟时一定要严格限制时间让自己适应“60秒答一道客观题”的节奏。如果一道题在三分钟内还没思路就果断标记回头再说笔试最怕的是在一道题上耗太久导致后面全乱。5.2 客观题练习的资料来源与使用方式资料方面经典教材一定要有。《运筹学》清华大学出版社这本书在物流类笔试里几乎是必看书目线性规划、图论、排队论这几章直接对应考试范围。《算法导论》不需要全看重点看排序、最短路、动态规划几章能理解伪代码和复杂度就够用。机器学习基础可以看周志华老师的《机器学习》前几章重点放在评估方法、正则化、集成学习上。刷题平台方面LeetCode和牛客网可以提供算法编程的日常手感但客观题合集还是要以“真题复盘”和“知识点练习”为主。有些同学会去收集很多年前的题目合集这些资料可以参考但不要沉迷。笔试题目每年都会更新但核心考点其实换汤不换药把知识点框架掌握牢任何一套题都能应对。5.3 考场上时间管理的节奏拿到试卷后先花30秒扫一遍题目构成确认单选、多选、判断、填空的题量和分值分布。然后按“先送分、再攻坚”的顺序答题。优先做数据结构、排序、概率公式这类确定性强的题再处理线性规划计算题、图论手算题。多选题和判断题的绝对化选项要留出额外时间检查因为这类题失分率高。做题时准备一个“优先级标记法”每道题旁边标一个符号比如“√”表示确定“△”表示犹豫“×”表示不会。等全部题做完后再集中攻克“△”和“×”的题目。多选题宁少勿多判断题遇到不确定的可以结合平时总结的“绝对化表述多为错”的经验来辅助判断——但这里的“多为”不等于“一定”不能完全依赖这个规律。6. 常见问题与避坑实录这些都是我踩过的和看别人踩过的客观题难度未必很高但丢分方式五花八门。把常见错误归一下类考前读一遍可能比多刷十道题更管用。6.1 概念混淆类错误一个表格帮你理清高频易混点我把自己在复习和做合集中遇到的高频易混概念整理成了一张对照表考前可以快速扫一眼易混概念关键区隔常见丢分场景对偶问题与原问题对偶问题的对偶是原问题约束方向和变量符号要转置写对偶模型时忽略非负限制平均队长与平均等待时间队长逗留队长等待率≠逗留率逗留时间等待时间服务时间M/M/1中把W当成等待时间而不是逗留时间L1与L2正则化L1倾向于得到稀疏解L2让权重整体变小但不会为0误选“L2可以使权重为0”Prim与KruskalPrim按点扩展Kruskal按边排序并查集连边在稀疏图中强行用Prim或忘记用并查集判环快速排序与归并排序快排平均O(nlogn)不稳定归并O(nlogn)稳定记错稳定性结论背包问题内层循环顺序0-1背包倒序完全背包正序把倒序看成编码风格问题而忽略数学原因看到这张表建议自己也动手整理一份“自己的版本”。整理的过程就是记忆的过程比单纯看别人的总结印象深得多。6.2 计算粗心类错误手算步骤与单位统一客观题涉及计算时最常见的丢分原因是草稿太乱、单位不统一、小数保留错误。图论的Dijkstra手算题建议画完一张清晰节点图后用表格记录每一轮“已确定节点集合”和“候选距离”这样既能减少重复计算也方便复查。线性规划的单纯形法迭代每一步都要标出进基变量和离基变量不要跳步因为一跳步就很容易抄错数。排队论的题目更是单位重灾区。到达率和服务率的单位要统一成“个/小时”或“个/分钟”统一之后再套公式。如果题目给出的λ120个/小时而μ3个/分钟先把λ换算成2个/分钟再算而不是直接用120除以3。这种错误本来可以避免丢掉非常可惜。6.3 策略失误类问题考前准备与临场心态最后一个坑是策略层面的比概念和计算问题更容易被忽略。最典型的是“准备笔试的时候只刷算法题从不看业务场景”。客观题合集里虽然大部分是纯知识题但部分场景题需要你理解物流业务语言。比如“中转场”“干线运输”“派送区域划分”这些词如果提前不了解做题时容易读题慢、抓不住关键约束。另外考场上看到一道题不会心态容易崩。客观题通常量比较多遇到不会的题先跳过去是正常操作。笔试不是竞赛不要求满分但要求尽量多地拿分。我个人的策略是每道客观题给自己“两道不会就标记跳过”的规则保证整张卷子有足够时间做完最后再回头处理被标记的题。这个方法在多次笔试里都验证过尤其是顺丰科技这种题目密度偏高的卷子效果尤其明显。最后再分享一个小技巧。我整理这套顺丰科技2019秋招运筹优化算法工程师客观题合集时最大的体会是客观题的终点不是答案而是答案背后的知识网络。每做完一道题可以顺手在笔记上写下“这道题考的是哪个模型的哪个性质我会不会在面试里把这部分讲清楚”。笔试只是第一关后续面试官大概率会顺着笔试题里的知识点继续深挖所以趁笔试复习把原理真正搞懂后面会省很多事。