【华为OD题库-082】TLV解析II-Java

题目

两端通过TLVQ格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。具体要求如下:

(1)消息包中多组tag、length、value紧密排列,其中tag,length各占1字节(uint8),value所占字节数等于length的值

(2) 结果数组中tag值已知,需要填充每个tag对应数据的length和valueOffset值(valueOffset为value在原消息包中的起始偏移量(从0开始,以字节为单位),即将消息包中的tag与结果数组中的tag进行匹配(可能存在匹配失败的情况,若结果数组中的tag在消息包中找不到,则ength和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
1
15
输出
4 2
说明
tag15(十六进制0F)对应数据的长度为4,其value从第三个字节开始,因此偏移量为2
示例2:
输入
0F04ABABABAB1001FF
2
15
17
输出
4 2
0 0
说明
第二个tag匹配失败

思路

本题比较容易,但是细节分析比较繁琐,容易出错
新建一个TLV对象,含有3个属性tag,length以及offset。
遍历输入的第一行content,i的初始值为0。
第一个tag:content.subStr(i,i+2),利用Integer.parseInt将16进制字符串转为数字即可
第一个length: content.subStr(i+2,i+4)
第一个的offset为起始字符的索引/2:(i+4)/2
接下来的字符内容:content.subStr(i+4,i+4+2*length),也就是说下一个TLV对象的起始索引值为:i+4+2*length,
因为题目要求了“不完整的一组TLV请丢弃掉”,即上述计算出来的tag或者length或者offset任意一个不存在,那么就不加入这个对象(只有当数组的索引越界时才会不存在)
接下来得到了两个排序的对象,list<TLV>以及nums
遍历nums,假设当前nums到 j 位置,list到 i 位置:

  1. 如果nums[i]>list.get(j).getTag():那么可以循环将j++,直到查找到下一个不大于nums[i]的位置,
  2. 如果list都遍历完了都没有找到,说明nums[i]大于list中的所有tag,此时直接将i位置的结果置为:0,0即可
  3. 如果循环后,nums[i]<list.get(j).getTag(),那么也说明找不到nums[i],直接将i位置的结果置为:0,0
  4. 如果循环后,nums[i]==list.get(j).getTag(),说明找到了,此时直接将list.get(i)中存放的length以及offset返回即可

题解

package hwod;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class TLVAnalyze {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String content = sc.nextLine();int n = sc.nextInt();int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}int[][] res = tLVAnalyze(content, nums);for (int i = 0; i < res.length; i++) {System.out.println(res[i][0] + " " + res[i][1]);}}private static int[][] tLVAnalyze(String content, int[] nums) {int[][] res = new int[nums.length][2];List<TLV> list = new ArrayList<>();int i = 0;while (i < content.length()) {int tag = (i + 2) <= content.length() ? Integer.parseInt(content.substring(i, i + 2), 16) : -1;int length = (i + 4) <= content.length() ? Integer.parseInt(content.substring(i + 2, i + 4), 16) : -1;int offSet = i + 4 + 2 * length <= content.length() ? (i + 4) / 2 : -1;if (tag != -1 && length != -1 && offSet != -1) list.add(new TLV(tag, length, offSet));i = i + 4 + 2 * length;}i = 0;for (int j = 0; j < nums.length; j++) {int cur = nums[j];while (i < list.size() && cur > list.get(i).getTag()) {i++;}if (i >= list.size() || cur < list.get(i).getTag()) {res[j] = new int[]{0, 0};} else {res[j] = new int[]{list.get(i).getLength(), list.get(i).getOffSet()};}}return res;}
}class TLV {private int tag;private int length;private int offSet;public int getTag() {return tag;}public int getLength() {return length;}public int getOffSet() {return offSet;}public TLV(int tag, int length, int offSet) {this.tag = tag;this.length = length;this.offSet = offSet;}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC 案例

文章目录 前言1. 计算器1.1 准备前端代码1.2 测试前端代码1.3 完成后端代码1.4 验证程序 2. 留言板2.1 前端代码准备2.2 测试前端代码2.3 完成前后端交互代码2.4 完成后端代码2.5 案例测试2.6 完善前后端交互2.7 完善后端代码2.8 完整功能测试 lombok简单的方式添加Lombok工具3…

vue3使用mitt用于组件之间传值

vue3已经没有提供配套的事件总线bus&#xff0c;需要使用第三方库mitt来完成vue2中bus完成的事情 1.安装 npm install mitt2.引用 bus.js import mitt from mitt; const bus mitt(); export default bus;3.在需要使用的vue文件中导入bus import bus from ./mitt4.使用mitt…

HarmonyOS学习 第1节 DevEco Studio配置

俗话说的好&#xff0c;工欲善其事,必先利其器。我们先下载官方的开发工具DevEco Studio. 下载完成后&#xff0c;进行安装。 双击DevEco Studio&#xff0c;点击Next按照指引完成安装 重新启动DevEco&#xff0c;点击 Agree 进入环境配置&#xff0c;安装Node.js和ohpm 点击Ne…

MQTT 协议入门:轻松上手,快速掌握核心要点

文章目录 什么是 MQTT&#xff1f;MQTT 的工作原理MQTT 客户端MQTT Broker发布-订阅模式主题QoS MQTT 的工作流程开始使用 MQTT&#xff1a;快速教程准备 MQTT Broker准备 MQTT 客户端创建 MQTT 连接通过通配符订阅主题发布 MQTT 消息MQTT 功能演示保留消息Clean Session遗嘱消…

【WPF】使用ObservableCollection解决:累积计数x与实际计数x不相同

使用观察模式和集合 错误代码 public List<IPAddress> iPAddressDevices new List<IPAddress>();public List<IPAddress> IPAddressDevices { get > iPAddressDevices; set {iPAddressDevices value;RaisePropertyChanged(nameof(IPAddressDevices));…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

vue-baidu-map实现在地图上选择范围并解决相关问题

vue-baidu-map实现在地图上选择范围并解决相关问题 实现地图上选择不规则范围实现功能遇到的问题1、覆盖物多边形怎么才能盖住覆盖物点2、遇到其他问题 实现地图上选择不规则范围 这个功能比较简单&#xff0c;只需要使用vue-baidu-map插件的覆盖物多边形功能就行了。直接看文…

Win10专业版找不到安全中心选项的解决方法

在Win10电脑中&#xff0c;安全中心功能起到很大的作用。但是&#xff0c;有用户在Win10专业版电脑上找不到安全中心选项&#xff0c;从而影响到自己的正常使用。下面小编分享解决Win10专业版系统没有安全中心的简单方法&#xff0c;解决后在Win10专业版就能成功找到安全中心了…

哈希表及其基础(java详解)

目录 一、哈希表基础 二、哈希函数的设计 哈希函数的设计原则 三、java中的hashCode 基本数据类型的hashCode使用 自定义类型的hashCode使用 需要注意 四、哈希冲突的处理 链地址法Seperate Chaining 五、实现属于我们自己的哈希表 六、哈希表的动态空间处理和复杂…

通过项目管理软件监管新员工入职流程的方法与策略

项目管理软件是什么&#xff1f;项目管理软件都能做什么&#xff1f;是不是只有项目团队需要啊&#xff1f;NO&#xff01;项目管理软件乍听其名不免让人觉得这不过是个项目领域的专用工具。 那什么是项目呢&#xff1f;项目是为创造独特的产品、服务或成果而进行的体系化的工…

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…

stm32中滴答定时器与普通定时器的区别

1、两者在单片机中的位置不一样 滴答定时器在内核上&#xff0c;普通定时器在外设上。 由于位置不同&#xff0c;滴答定时器的程序可以移植到所有相同内核的芯片上&#xff0c;但普通定时器的程序却不可以。 2、两者的中断优先级不一样 滴答定时器优先级高&#xff0c;普通定…

CTF刷题记录

刷题 我的md5脏了KFC疯狂星期四坤坤的csgo邀请simplePHPcurl 我的md5脏了 g0at无意间发现了被打乱的flag&#xff1a;I{i?8Sms??Cd_1?T51??F_1?} 但是好像缺了不少东西&#xff0c;flag的md5值已经通过py交易得到了&#xff1a;88875458bdd87af5dd2e3c750e534741 flag…

关于微信/支付宝等平台验签/签名sign生成算法

引言 我们在日常工作中经常会遇到对接微信平台、支付宝平台、或者自己对外开放一个api服务&#xff0c;那么这里经常会出现一个名字&#xff1a;sgin&#xff08;签名&#xff09;。 举个栗子 这是微信支付统一下单接口文档&#xff0c;最简单的理解就是&#xff0c;服务端为…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库&#xff0c;用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API&#xff0c;可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求&#xff0c;可以轻松地与JSON、XML等数据格式进行…

最优化方法复习——线性规划之对偶问题

一、线性规划对偶问题定义 原问题&#xff1a; 对偶问题&#xff1a; &#xff08;1&#xff09;若一个模型为目标求 “极大”&#xff0c;约束为“小于等于” 的不等式&#xff0c;则它的对偶模型为目标求“极小”&#xff0c;约束是“大于等于”的不等式。即“Max&#xff0…

2024年甘肃省职业院校技能大赛信息安全管理与评估三阶段理论样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 第六部分 理论技能与职业素养&#xff08;100 分&#xff09; 【注意事项】 1.该部分答题时长包含在第三阶段竞赛时长内&#xff0c;请在临近竞赛结束前提交。 2.参赛团队可根据自身情况…

数据库系统概论复习资料

数据库系统概论考试需知 一、分值分布 1、判断题&#xff08;10分&#xff09; 1分一个 2、填空题&#xff08;20分&#xff09; 2分一个 3、选择题&#xff08;20分&#xff09; 2分一个 4、分析题&#xff08;30分&#xff09; 第一题10分&#xff0c;第二题…

如何设置echart图表在vue页面屏幕比例缩放自适应问题

问题&#xff1a;页面的echart图表在浏览器缩放屏幕比例时无法随着屏幕的比例自动改变大小 解决方式&#xff1a; 可以通过监听窗口的 resize 事件&#xff0c;并在事件回调函数中重新调整图表的大小。 <template><div ref"chartContainer" style"w…

Enterprise Architect 12版本使用教程

Enterprise Architect 12版本使用教程 1.下载安装Enterprise Architect 122.Enterprise Architect原始DDL模板配置及存在的问题1.DDL Column Definition原始模板&#xff08;没有default值&#xff1a;可忽略&#xff09;2.DDL Data Type原始模板&#xff08;timestamp等时间字…