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

2023-12-08 09:12
文章标签 java 华为 解析 ii 题库 od tlv 082

本文主要是介绍【华为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),查看当前专栏更新的所有题目。

这篇关于【华为OD题库-082】TLV解析II-Java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/469299

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本