华为 · 模拟 · 算法编程题
华为 模拟 时限 2 秒 / 256 MB

题目描述

小红正在检查大模型注意力模块的底层实现。为了批量处理不同长度的句子,输入中会包含 padding;为了保证自回归生成过程不偷看未来,还需要加入因果掩码。
给定一个已经缩放后的注意力得分张量 Score,形状为 B 个 batch、H 个 head、每个 head 一个 S*S 的矩阵。对于每个 batch b,给出有效长度 L_b。
小红需要依次完成三步:
1. 因果掩码:若列下标 j 大于行下标 i,则该位置不可见。
2. Padding 掩码:若 j >= L_b,则该位置不可见。
3. 位置惩罚:对仍可见的位置,令 slope = head_index + 1,并将得分减去 (i-j)*slope。
最后对每一行的可见位置做 safe softmax。不可见位置输出 0;如果一整行没有可见位置,则整行输出 0。

样例共 1 组

样例 1
输入
2 2 2
2 1
10.0 10.0
10.0 10.0
10.0 10.0
10.0 10.0
5.0 5.0
5.0 5.0
5.0 5.0
5.0 5.0
输出
1.0000 0.0000
0.2689 0.7311
1.0000 0.0000
0.1192 0.8808
1.0000 0.0000
1.0000 0.0000
1.0000 0.0000
1.0000 0.0000

算法解析依据充分

考点:模拟

限制 2 秒 / 256MB | 核心代码模式(实现给定函数)

题目画像

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

解题思路

推荐方向:模拟

本题切入点

三步掩码叠加后做 safe softmax:先因果掩码(j>i 不可见)再 padding 掩码(j≥L_b),可见位按 (i−j)·(head+1) 做位置惩罚,每行减最大值后 exp 归一化,整行不可见时输出 0。

不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。

思路框架(模拟 通法 · 非本题专属)

  1. 用变量记录题目要求的「状态」(当前值、剩余数量、当前位置等)。
  2. 按题面给出的顺序,把每一步操作写成一段代码,逐条执行。
  3. 每一步执行后更新状态,并在题目要求的位置输出或累计答案。
  4. 注意循环的边界:执行多少次、何时终止、是否能终止。

实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。

复杂度:时间 O(操作次数) | 空间 O(状态数)

该范式的通法易错点

  • 终止条件写错导致死循环或漏做最后一次操作。
  • 状态更新顺序颠倒(先改了下标又用旧下标)。
  • 题目里「最多 / 恰好 / 至少」的语义差别没区分。

样例

样例 1

  • 输入:2 2 2 / 2 1 / 10.0 10.0 / 10.0 10.0 / 10.0 10.0 / 10.0 10.0 / 5.0 5.0 / 5.0 5.0 / 5.0 5.0 / 5.0 5.0
  • 输出:1.0000 0.0000 / 0.2689 0.7311 / 1.0000 0.0000 / 0.1192 0.8808 / 1.0000 0.0000 / 1.0000 0.0000 / 1.00

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

本题来源:2026年-华为-05月09号AI岗。

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