不同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 至少包含 tag、length 和 length 个 value 元素,因此原始长度为 2 + length。由于单个 TLV 总占位必须是 4 的倍数,所以需要把 2 + length 向上补齐到最近的 4 的倍数。
解析时从数组头部开始,每次确定当前 TLV 的实际占位长度,校验该段所有元素是否都在 到 99 之间,并把当前 tag 加入集合。只要某一步无法继续解析,直接输出 。
算法步骤
- 读取一行输入,按英文逗号切分,得到数组
arr。 - 使用指针
index指向当前 TLV 的起始位置。 - 如果当前位置后面没有
length字段,说明格式错误,返回。 - 读取
length = arr[index + 1],若length <= 0,返回。 - 当前 TLV 原始长度为
2 + length,补齐后的占位长度为((2 + length + 3) / 4) * 4。 - 如果当前 TLV 补齐后会越过数组末尾,返回
。 - 检查当前 TLV 占用范围内的每个元素,若不在
到99之间,返回。 - 将
arr[index]加入 tag 集合,指针后移一个补齐后的 TLV 长度。 - 当指针刚好走到数组末尾时,返回集合大小。
复杂度分析
设数组长度为 n。
- 每个数组元素最多被检查一次,时间复杂度为
O(n)。 - 需要使用集合保存不同 tag,最多保存
1000个 TLV 的 tag,空间复杂度为O(k),其中k为不同 tag
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/747
文章版权归作者所有,未经允许请勿转载。
THE END