华为OD E卷(100分)53-TLV解码

前言

工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

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

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

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

输入码流的16进制字符中,不包括小写字母,且要求输出的16进制字符串中也不要包含小写字母;码流字符串的最大长度不超过50000个字节。

输入描述

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

输出描述

输出一个字符串,表示待解码信元以16进制表示的Value。

示例

输入

复制代码
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

输出

复制代码
2 33

说明

需要解析的信元的Tag是31,

从码流的起始处开始匹配,

第一个信元的Tag是32,信元长度为1(01 00,小端序表示为1);

第二个信元的Tag是90,其长度为2;

第三个信元的Tag是30,其长度为3;

第四个信元的Tag是31,其长度为2(02 00),

所以返回长度后面的两个字节即可,即32 33。

解题思路

  1. 小端序表示的Length

    • 小端序表示法即低字节在前,高字节在后。比如长度为 01 00,表示的实际长度是 1(即 0001)。而 02 00 表示长度 2(即 0002)。
  2. Tag 的固定长度是1字节, Length 固定是2字节,而 Value 的长度是根据 Length 来决定的。

题解

Java实现

java 复制代码
package huawei.e100;

import java.util.Scanner;

/**
* @author arnold
* @date 2025年1月13日
* TLV 解码
*/
public class T53 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String tag = sc.nextLine();
			String[] data = sc.nextLine().split(" ");
			int index = 0;
			while(index <  data.length) {
				String itag = data[index];
				int l = Integer.parseInt(data[index + 2] + data[index + 1], 16);
				if (tag.equals(itag)) {
					for(int j= index+3; j< index+3+l && j< data.length; j++) {
						System.out.print(data[j] + " ");
					}
					System.out.println();
					break;
				} else {
					index = index + 3 + l;
				}
			}
		}

	}

}
相关推荐
_日拱一卒几秒前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
wuxinyan1234 分钟前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
计算机安禾5 分钟前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
新知图书6 分钟前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队11 分钟前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
SatVision炼金士11 分钟前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法
洛_尘14 分钟前
Java EE进阶:Linux的基本使用
java·java-ee
wuweijianlove15 分钟前
算法稳定性与数值误差传播研究的技术2
算法
宸津-代码粉碎机16 分钟前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
MaCa .BaKa18 分钟前
47-心里健康咨询平台/心理咨询系统
java·spring boot·mysql·tomcat·maven·intellij-idea·个人开发