刷题记录-TLV解码-100分

刷题笔记合集🔗

题目描述

TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。

码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,字节序为小端序

现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。

输入格式

第一行: 一个字符串,表示待解码信元的Tag 第二行: 一个字符串,表示待解码的16进制码流,字节之间用空格分隔

说明:

  • 输入码流的16进制字符中不包括小写字母
  • 码流字符串的最大长度不超过50000个字节

输出格式

输出一个字符串,表示待解码信元以16进制表示的Value(不含小写字母)

约束说明

  • Tag固定占1字节
  • Length固定占2字节(小端序)
  • Value长度由Length决定
  • 所有16进制字符均为大写

样例输入1

31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC

样例输出1

32 33

样例说明1

从码流起始处开始匹配:

  1. 第一个信元:
    • Tag: 32
    • Length: 01 00 (小端序表示为1)
    • Value: AE
  2. 第二个信元:
    • Tag: 90
    • Length: 02 00 (小端序表示为2)
    • Value: 01 02
  3. 第三个信元:
    • Tag: 30
    • Length: 03 00 (小端序表示为3)
    • Value: AB 32 31
  4. 第四个信元:
    • Tag: 31 (目标Tag)
    • Length: 02 00 (小端序表示为2)
    • Value: 32 33 (这就是要找的值)
  5. 第五个信元:
    • Tag: 33
    • Length: 01 00 (小端序表示为1)
    • Value: CC

题目解析

本题的关键点在于:

  1. 码流解析

    • 每个信元由Tag(1字节) + Length(2字节) + Value(Length字节)组成
    • 信元紧密排列,需要根据Length来定位下一个信元
  2. 小端序处理

    • Length的两个字节需要反转再转为十进制
    • 如01 00表示长度为1,而不是256
  3. 16进制处理

    • 输入输出都是大写16进制字符
    • 字节间用空格分隔

实现思路:

  1. 将码流按空格分割为字节数组
  2. 遍历处理每个信元:
    • 读取Tag(1字节)
    • 读取并解析Length(2字节,需反转)
    • 读取Value(Length个字节)
  3. 找到目标Tag时返回其Value

时间复杂度: O(n),其中n是码流长度

参考代码

def solve():
    # 读取输入
    target = input()
    stream = input().split()
    
    # 遍历处理每个信元
    i = 0
    while i < len(stream):
        # 读取Tag
        tag = stream[i]
        i += 1
        
        # 读取Length(小端序)
        length = int(stream[i+1] + stream[i], 16)
        i += 2
        
        # 读取Value
        value = stream[i:i+length]
        i += length
        
        # 找到目标Tag
        if tag == target:
            return " ".join(va

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

想干测开的tomca...:这份简历是“大一新生硬凹资深后端”的典型反面教材,槽点离谱到能让面试官直接笑出声: ### 1. 「年龄+入学时间」和项目复杂度完全脱节,可信度直接归0 你2024年7月才入学(现在刚读了1年多),19岁的大一新生,能把Vue3+Spring Boot+ShardingSphere+K8s+AI这些技术全塞进两个项目里?别说实际开发,光把这些技术的文档看完都得半年——这不是“能力强”,是“把招聘JD里的技术词全抄过来造假”,明摆着没碰过实际代码
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务