这次整理了两道 McKinsey OA 真题,考试平台为 HackerRank。一道是数组成本优化问题,需要通过插入一个整数降低数组的整体成本;另一道是机器学习分类问题,需要根据用户属性识别机器人,并完成数据清洗、特征处理和模型训练。
两道题的考查方向不同。数组题重点在于分析操作对相邻元素的影响,找到成本变化最小的方案;机器学习题则更关注数据预处理、特征选择和分类模型的应用。下面按题目顺序整理具体要求与解题思路。
第一题:插入一个整数使数组成本最小
题目描述
给定一个包含 (n) 个正整数的数组 arr,数组使用从 0 开始的索引。数组的成本(Cost)定义为所有相邻元素之差的平方和:\\operatorname{cost}(arr)=\\sum_{i=1}\^{n-1}(arr\[i-arri-1)^2]
现在需要在数组中的任意位置恰好插入一个整数。插入位置可以是数组开头、末尾,也可以是任意两个相邻元素之间。
目标是使插入操作完成后的数组成本尽可能小,并返回最小成本。
解题思路
这道题的关键是分析插入操作会改变哪些部分的成本。假设数组中有两个相邻元素 (a) 和 (b),它们原本产生的成本为:(b-a)\^2如果在两者之间插入整数 (x),原来的这一项就会变成两项:(x-a)\^2+(b-x)\^2其他相邻元素之间的差值不会发生变化,因此不需要重新考虑整组数组关系,只需要计算插入操作对局部成本的影响。
为了让这两项之和最小,最优位置是 (a) 和 (b) 的中点:x=\\frac{a+b}{2}如果题目要求插入的必须是整数,而中点不是整数,则需要在两个相邻整数候选值中选择成本较小的一个。
当 (a) 和 (b) 都是正整数时,可以使用整数除法得到候选值,再检查相邻候选值,确保结果符合整数约束。
对于一对相邻元素,插入中点后,这部分的最小成本为:
\\frac{(b-a)\^2}{2}这里的表达式对应允许实数取值的情况;如果只能插入整数,需要根据两数之和的奇偶性处理。
实现步骤
-
遍历数组,计算原始成本。
-
遍历每一对相邻元素,计算插入一个整数后这部分的最小成本。
-
将局部成本变化与原始成本结合,得到每个插入位置对应的新成本。
-
比较所有候选结果,返回最小值。
如果允许插入任意整数,且原数组只有一个元素,那么插入与原元素相同的整数即可使成本为零。实现时也需要注意数组长度为 1 的边界情况。
复杂度分析
设数组长度为 (n)。
-
时间复杂度:(O(n)),只需要遍历数组并计算相邻元素的成本。
-
空间复杂度:(O(1)),如果直接在遍历过程中累计结果,不需要额外数组。
解题重点: 不要在每个候选位置都重新计算整个数组的成本。先找到插入操作影响的局部项,再计算成本变化,可以显著简化实现。
第二题:基于用户属性的机器人分类预测
题目描述
给定一组用户属性数据,需要根据每条记录中的特征判断对应用户是否为机器人(Bot)。
这道题涉及完整的机器学习处理流程,包括数据清洗、特征筛选、异常值处理和分类模型训练。不能只调用一个分类算法就结束,还需要确保输入数据符合模型的要求,并对模型预测结果进行评估。
解题思路
1. 数据清洗(Data Cleaning)
首先检查数据中的缺失值和异常表示。
题目要求将 unknown 以及不合理的二元值视为缺失数据。需要根据字段的实际含义,将这些值统一转换为适当的缺失值表示,避免模型把无效数据误认为正常类别。
完成转换后,还应检查每个字段的数据类型是否正确。例如,数值型字段应能进行数值运算,类别型字段则需要使用适合模型的编码方式。
2. 特征选择(Feature Selection)
并非所有用户属性都能有效区分机器人和正常用户。
需要根据题目提供的数据字段,筛选与分类目标相关的特征,并剔除题目要求排除的异常记录或无效字段。
这一阶段的重点是确保输入特征具有合理的预测价值,同时避免把目标标签或其他不应参与训练的信息混入特征中,造成 Data Leakage(数据泄漏)。
3. 训练随机森林模型(Random Forest)
完成预处理后,可以使用 Random Forest(随机森林)进行分类。
随机森林通过组合多棵决策树的预测结果完成分类,能够处理非线性关系,也适用于包含多种用户属性的结构化数据。
基本流程如下:
-
准备处理后的训练数据和目标标签。
-
按题目要求划分训练集与验证集,或使用指定的数据划分方式。
-
训练 Random Forest 分类器。
-
对测试数据进行预测,并按照题目要求输出结果。
具体的模型参数、数据划分比例和输出格式,应以 HackerRank 题目给出的要求为准,不应自行假设。
4. 评估模型表现(Model Evaluation)
模型完成训练后,还需要评估其分类效果。
常见指标包括:
-
Accuracy: 所有预测中判断正确的比例。
-
Precision: 被预测为机器人的记录中,实际为机器人的比例。
-
Recall: 所有实际机器人记录中,被正确识别出来的比例。
-
F1 Score: Precision 和 Recall 的调和平均数。
如果机器人样本与正常用户的数量差距较大,仅看 Accuracy 可能无法准确反映模型效果。因此,需要结合数据分布和题目要求选择合适的评估指标。
解题重点
这道题的难点主要集中在数据处理流程,而不只是模型本身。
-
缺失值处理: 正确识别
unknown和不合理的二元值。 -
特征处理: 根据字段含义筛选特征,并确保数据格式符合模型要求。
-
模型训练: 使用 Random Forest 完成分类任务。
-
结果验证: 检查预测结果与规定的输出格式,并根据合适的指标评估模型。
如果预处理步骤出错,即使模型能够正常运行,也可能产生不准确的预测结果。
如何备考 McKinsey OA
准备 McKinsey OA 时,可以根据目标岗位和考试说明,分别练习算法编程与数据分析类任务。不同岗位的测试形式可能存在差异,不能假设所有申请人都会遇到相同题目。
1. 练习数组与算法优化
重点掌握数组遍历、相邻元素关系、局部成本变化和边界情况处理。
遇到需要执行一次操作来优化结果的题目时,先明确操作影响哪些元素,再推导操作前后的差值。对于可以通过局部变化计算答案的问题,优先考虑能否使用一次遍历完成,而不是反复模拟整个过程。
2. 熟悉数据清洗与机器学习基础
建议熟悉以下概念:
-
Missing Value Handling(缺失值处理)
-
Outlier Detection(异常值识别)
-
Feature Selection(特征选择)
-
Classification(分类)
-
Random Forest(随机森林)
除了了解每个步骤的作用,也需要理解数据预处理为什么会影响最终预测结果。
3. 理解分类评估指标
掌握 Accuracy、Precision、Recall 和 F1 Score 的区别。
例如,在机器人识别任务中,如果更关注减少漏判机器人,就需要重点关注 Recall;如果更关注避免把正常用户错误识别为机器人,则需要关注 Precision。具体使用哪项指标,应根据题目目标判断。
4. 进行限时练习
在接近实际考试的时间限制下完成练习,并在提交前检查以下内容:
-
数组长度为
1或存在特殊边界值时,算法是否正确。 -
插入整数的约束是否得到满足。
-
缺失值和异常数据是否按要求处理。
-
训练数据与预测数据的特征是否一致。
-
输出格式是否严格符合题目要求。
5. 提前准备后续面试
在线测试只是招聘流程中的一个环节。除了 Coding 和数据分析练习,也可以提前整理个人项目、团队合作、解决问题和处理困难的经历,为后续可能出现的 Behavioral Interview(行为面试)做准备。
具体招聘流程和考查内容应以申请岗位及招聘人员提供的信息为准。
McKinsey OA 常见问题(FAQ)
1. McKinsey OA 主要考什么?
具体考查内容取决于申请的岗位和测试安排,可能涉及编程、数据分析、机器学习或其他能力评估。建议以收到的在线测试邀请和岗位要求为准。
2. McKinsey OA 的数组成本题怎么解?
核心是分析插入一个整数后,相邻元素的平方差之和如何变化。遍历相邻元素对,计算插入后对应的最小局部成本,再结合原数组其他部分的成本,比较各个候选位置即可。
需要特别注意整数约束。如果中点不是整数,就不能直接将实数中点作为最终插入值。
3. McKinsey OA 的机器人分类题使用什么模型?
这道题涉及 Random Forest(随机森林)分类模型。建模之前,需要处理 unknown 和不合理的二元值,筛选相关特征,并根据题目要求处理异常数据。模型训练完成后,还应根据合适的分类指标检查预测效果。
4. 准备 McKinsey OA 需要学习机器学习吗?
是否需要系统学习机器学习,取决于目标岗位和具体测试内容。如果测试涉及分类任务,建议至少掌握基础数据清洗、特征选择、常见分类算法和评估指标,并熟悉题目指定的编程环境或机器学习工具。
总结
这两道 McKinsey OA 真题分别考查算法优化与机器学习应用。
数组题需要从相邻元素的平方差入手,推导插入操作对局部成本的影响,并正确处理整数约束。机器人分类题则需要按顺序完成数据清洗、特征处理、模型训练和结果评估。
练习这类题目时,除了掌握算法和模型的基本原理,还要重视题目约束、数据格式与边界情况。先把问题要求理解清楚,再选择合适的实现方式,通常比直接套用代码模板更有效。