不同Tag类型统计

2026 华为OD机试真题 7月22日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定一个数组,元素为数字,数组的内容表示多个连续的TLV(tag-length-value);

关于TLV,单个TLV具备以下特征:

  • tag:占位1个数组元素,代表类型;
  • length:占位1个数组元素,代表长度,且长度值大于
  • value:占位后面连续的length个数组元素;
  • tlv长度限制:单个TLV所占的数组元素必须是4的倍数,不足的部分可用任意数字补齐;
  • 数值取值范围-99

例如:单个TLV数组:2130,第一个数字2是tag,第二个数字1是length,第三个数字3是value,第四个数字是补齐;

现在要求把给定的数组进行分析,解析出整个数组中存在多少种不同类型的tag,如果解析过程出现数组元素不符合规范,则返回

2026 华为OD机试真题 7月22日华为OD上机新系统考试真题 100 分题型

输入描述

数组元素不超过10000,TLV的总数不超过1000

输出描述

解析出的不同tag类型的数量,若格式错误则输出

示例1

输入

2,1,3,0,3,1,3,0,0

输出

说明

格式不对

示例2

输入

2,1,3,0,3,1,3,0

输出

2

说明

格式正确,2个Tag类型,分别是2、3

解题思路

核心思想

数组由若干个连续 TLV 块组成。每个 TLV 至少包含 taglengthlengthvalue 元素,因此原始长度为 2 + length。由于单个 TLV 总占位必须是 4 的倍数,所以需要把 2 + length 向上补齐到最近的 4 的倍数。

解析时从数组头部开始,每次确定当前 TLV 的实际占位长度,校验该段所有元素是否都在 99 之间,并把当前 tag 加入集合。只要某一步无法继续解析,直接输出

算法步骤

  1. 读取一行输入,按英文逗号切分,得到数组 arr
  2. 使用指针 index 指向当前 TLV 的起始位置。
  3. 如果当前位置后面没有 length 字段,说明格式错误,返回
  4. 读取 length = arr[index + 1],若 length <= 0,返回
  5. 当前 TLV 原始长度为 2 + length,补齐后的占位长度为 ((2 + length + 3) / 4) * 4
  6. 如果当前 TLV 补齐后会越过数组末尾,返回
  7. 检查当前 TLV 占用范围内的每个元素,若不在 99 之间,返回
  8. arr[index] 加入 tag 集合,指针后移一个补齐后的 TLV 长度。
  9. 当指针刚好走到数组末尾时,返回集合大小。

复杂度分析

设数组长度为 n

  • 每个数组元素最多被检查一次,时间复杂度为 O(n)
  • 需要使用集合保存不同 tag,最多保存 1000 个 TLV 的 tag,空间复杂度为 O(k),其中 k 为不同 tag
THE END