目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、Java算法源码
- 五、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
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 | 32 33 | 需要解析的信元的Tag是31,从码流的起始处开始匹配, 第一个信元的Tag是32,信元长度为1(01 00,小端序表示为1); 第二个信元的Tag是90,其长度为2; 第三个信元的Tag是30,其长度为3; 第四个信元的Tag是31,其长度为2(02 00), 所以返回长度后面的两个字节即可,即32 33。 |
四、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input1 = scanner.nextLine();
String input2 = scanner.nextLine();
String[] arr = input2.split(" ");
for (int i = 0; i < arr.length; ) {
String tag = arr[i];
int len = Integer.parseInt(arr[i + 2] + arr[i + 1]);
StringBuilder value = new StringBuilder();
i += 2;
for (int j = 1; j <= len; j++) {
value.append(arr[i + j] + " ");
i++;
}
if (tag.equals(input1)) {
System.out.println(value);
break;
}
if (i <= (arr.length - 1)) {
i++;
}
}
}
}
五、效果展示
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
2、输出
32 33
3、说明
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。