华为 · 排序 · 算法编程题
华为 排序 时限 1 秒 / 256 MB

题目描述

·
你需要为一个简单的多分类识别器补上“K 近邻”判别模块。做法是:先度量待测样本与训练样本的距离,挑选出距离最近的 K 个样本,再用多数票决定最终类别。
·
操作要点(按流程执行):
·
先计算待测点到每个样本点的距离(为了效率,可直接用“平方欧氏距离”参与排序,结果等价)。
·
将样本按距离升序排列,截取前 K 个作为近邻。
·
统计这 K 个近邻的标签出现次数,频数最高的标签即为预测值。
·
如出现“最高频数并列”,只在并列标签对应的近邻里,按由近到远的顺序挑第一个的标签。
·
约束与假设:
·
数据集已做归一化处理(不同维度量纲一致),特征保留两位小数。
·
每个类别在数据集中都至少有一个样本。
·
距离采用欧氏距离: d(q,x)=√(Σ_)i=1^n(q_i-x_i)^2

输入输出

输入描述
· 第 1 行:k m n s
k 为最近邻个数(≤20),m 为样本数(≤200),n 为特征维度(不含标签,≤5),s 为类别个数(≤5)。
· 第 2 行:待分类样本的 n 维特征。
· 第 3 行至第 m+2 行:每行 n+1 列,前 n 列为特征,最后 1 列为类别标签(整数,以浮点给出)。
输出描述
输出两项:预测标签 与 该标签在前 K 个近邻中的出现次数
格式:label count

样例共 2 组

样例 1 · 距离最近的 3 个样本依次为 (0.05,0.02,0), (0.20,0.10,0), (0.30,0.00,0)。 多数票为标签 0,且在前 K=3 个邻居中出现 3 次,故输出“0 3”。
输入
3 6 2 2
0.00 0.00
0.20 0.10 0.0
0.30 0.00 0.0
0.00 0.40 1.0
0.60 0.60 1.0
0.05 0.02 0.0
0.90 0.90 1.0
输出
0 3
样例 2 · 最近的 4 个邻居按距离为:(0.95,0.95,2)、(1.10,1.00,2)、(0.90,1.10,1)、(0.80,0.90,1)。 标签 1 与 2 在前 K=4 中均出现 2 次,构成并列;比较并列集合中“最近”的样本,其最近者为 (0.95,0.95,2),因此最终返回标签 2;同时输出该标签在前 K 中出现的次数 2。
输入
4 6 2 3
1.00 1.00
0.95 0.95 2.0
1.10 1.00 2.0
0.90 1.10 1.0
0.80 0.90 1.0
2.00 2.00 3.0
1.30 1.40 1.0
输出
2 2

算法解析依据一般

考点:排序

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:排序

先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。

思路框架(排序 通法 · 非本题专属)

  1. 排序后很多性质变简单:相邻关系、前缀性质、二分可行。
  2. 若题目禁止使用排序库函数,则手写快排/归并(归并还能顺带求逆序对)。
  3. 排序常与其他范式组合,比如「排序 + 贪心」「排序 + 二分」「排序 + 双指针」。

实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。

复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)

该范式的通法易错点

  • 自定义比较函数不满足严格弱序会导致运行时崩溃。
  • 排序后丢失原始下标,题目需要下标时记得用 pair 一起排。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例解读

样例 1:输入 3 6 2 2 / 0.00 0.00 / 0.20 0.10 0.0 / 0.30 0.00 0.0 / 0.00 0.40 1.0 / 0.60 0.60 1.0 / 0.05 0.02 0.0 → 输出 0 3

距离最近的 3 个样本依次为 (0.05,0.02,0), (0.20,0.10,0), (0.30,0.00,0)。

多数票为标签 0,且在前 K=3 个邻居中出现 3 次,故输出“0 3”。

样例 2:输入 4 6 2 3 / 1.00 1.00 / 0.95 0.95 2.0 / 1.10 1.00 2.0 / 0.90 1.10 1.0 / 0.80 0.90 1.0 / 2.00 2.00 3.0 → 输出 2 2

最近的 4 个邻居按距离为:(0.95,0.95,2)、(1.10,1.00,2)、(0.90,1.10,1)、(0.80,0.90,1)。

标签 1 与 2 在前 K=4 中均出现 2 次,构成并列;比较并列集合中“最近”的样本,其最近者为 (0.95,0.95,2),因此最终返回标签 2;同时输出该标签在前 K 中出现的次数 2。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-8月27号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解