华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。
具体要求如下:
第一行:一个字符,代表收到的消息包。字符串长度在10000以内。
第二行:需要匹配的tag数量n(0 < n < 1000)
后面N行:需要匹配n个tag值(十进制表示),递增排列。
和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。
package com.guor.od;
import java.util.*;
public class OdTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 收到的消息包
String msg = sc.next();
// 需要匹配的tag数量n
int n = sc.nextInt();
// 后面N行:需要匹配n个tag值(十进制表示),递增排列
int[] tags = new int[n];
for (int i = 0; i < n; i++) {
tags[i] = sc.nextInt();
}
// 定义哈希表,存储tag对应的length和valueOffset
Map<Integer, List<Integer>> tagMap = new HashMap<>();
// 解析字符串msg,初始化哈希表
for (int i = 0; i + 3 < msg.length(); i++) {
int tag, len, valueOffset;
String tagStr = msg.substring(i, i + 2);
String lenStr = msg.substring(i + 2, i + 4);
// 将16进制字符串转换为整数
tag = Integer.parseInt(tagStr, 16);
len = Integer.parseInt(lenStr, 16);
// 计算valueOffset
valueOffset = (i + 5) / 2;
// 跳过value,更新i
i += 3 + len * 2;
// 如果i超出msg长度,跳出循环
if (i >= msg.length()) {
break;
}
// 将tag、length、valueOffset存入tagMap中
tagMap.put(tag, Arrays.asList(len, valueOffset));
}
// 遍历tags,输出匹配结果
for (int tag : tags) {
if (tagMap.containsKey(tag)) {
List<Integer> tmp = tagMap.get(tag);
int len = tmp.get(0);
int valueOffset = tmp.get(1);
System.out.println(len + " " + valueOffset);
} else {
System.out.println("0 0");
}
}
}
}
0F04ABABABAB
1
15
4 2
tag15(十六进制0F)对应数据的长度为4,其value从第三个字节开始,因此偏移量为2。
下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。