> 文章列表 > 【华为OD机试真题 C++】1070 - TLV解析 Ⅱ | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1070 - TLV解析 Ⅱ | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1070 - TLV解析 Ⅱ | 机试题+算法思路+考点+代码解析

文章目录

    • 一、题目
      • 🔸题目描述
      • 🔸输入输出
      • 🔸样例1
      • 🔸样例2
    • 二、代码参考
  • 作者:KJ.JK

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:华为OD机试真题(C++)


一、题目


🔸题目描述

两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag, length, valueOffset)列表。
 
具体要求如下:
(1)消息包中多组tag、length、 value紧密排列, 其中tag,length各 占1字节(uint8__t) , value所占字节数等于length的值
 
(2)结果数组中tag值已知,需要填充每个tag对应数据的length和valueOffset值(valueffset为value在原消息包中的起始偏移量(从0开始,以字节为单位)),即将消息包中的tag与结果数组中的tag进行匹配(可能存在匹配失败的情况,若结果数组中的tag> 在消息包中找不到,则length和valueOffset都为0)
 
(3)消息包和结果数组中的tag值都按升序排列,且不重复
 
(4)此消息包未被篡改,但尾部可能不完整,完整的一组TLV请丢弃掉


🔸输入输出

输入
第一行:一个字符串,代表收到的消息包。字符串长度在10000以内。
 
● 说明1:字符串使用十六进制文本格式(字母为大写)展示消息包的数据,如0F04ABABABAB代表一组TLV:前两个字符(0F) 代表
tag值为15,接下来两个字符(04) 代表length值为4字节,接下来8个字符即为4字节的value。
 
● 说明2:输入字符串中,每一组TLV紧密排列,中间无空格等分隔符
 
第二行:需要匹配的tag数量n (0 <n <1000)。
 
后面n行:需要匹配的n个tag值(十进制表示), 递增排列。
输出
和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成


🔸样例1

输入
0F04ABABABAB
15输出
4 2说明:
tag15(十六进制0F)对应数据的长度为4,其value从第三个字节开始。 因此偏移量为2

🔸样例2

输入
0F04ABABABAB1001FF
2
15
17输出
4 2
0 0说明:
第二个tag匹配失败

二、代码参考

#include <iostream>
#include <unordered_map>
#include <string>
#include <sstream>
#include <vector>using namespace std;int main() {// 定义变量并读取输入string msg;int n;cin >> msg >> n;int tags[n];for (int i = 0; i < n; i++) {cin >> tags[i];}// 定义哈希表,存储tag对应的length和valueOffsetunordered_map<int, vector<int>> tagMap;// 解析msg,填充哈希表for (int i = 0; i + 3 < msg.length(); i++) {int tag, len, valueOffset;string tagStr = msg.substr(i, 2);string lenStr = msg.substr(i + 2, 2);// 将16进制字符串转换为整数stringstream ss;ss << hex << tagStr;ss >> tag;ss.clear();ss << hex << lenStr;ss >> len;// 计算valueOffsetvalueOffset = (i + 5) / 2;// 跳过value,更新ii += 3 + len * 2;// 如果i超出msg长度,跳出循环if (i >= msg.length()) break;// 将tag、length、valueOffset存入哈希表中tagMap[tag] = {len, valueOffset};}// 遍历tags,输出匹配结果for (int tag : tags) {if (tagMap.count(tag)) {vector<int> tmp = tagMap[tag];int len = tmp[0];int valueOffset = tmp[1];cout << len << " " << valueOffset << endl;} else {cout << "0 0" << endl;}}return 0;
}

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习