华为OD机试 - TLV格式 - 逻辑分析(Java 2023 B卷 100分)

news2024/11/18 23:28:06

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

  1. 消息包中多组tag,length,value紧密排列,其中tag,length各种1字节(uint8_t),value所占字节数等于length的值。
  2. 结果数组中tag值已知,需要田中每个tag对应数据的length和valueOffset值(valueOffset为value在原消息包中的起始偏移量(从0开始,以字节为单位)),即将消息包中的tag与结果数组中的tag进行匹配(可能存在匹配失败的情况,若结果数组中tag在消息包中找不到,则length和valueOffset都为0)。
  3. 消息包和结果数组职工的tag值都按升序排序,且不重复。
  4. 此消息包未被篡改,但尾部可能不完整,不完整的一组TLV请丢弃掉。

二、输入描述

第一行:一个字符,代表收到的消息包。字符串长度在10000以内。

  • 说明1:字符串使用十六进制文本格式(字母为大写)来展示消息包的数据,如0F04ABABABAB代表一组TLV:前两个字符(OF)代表tag值为15,接下来两个字符(04)代表length值为4字节,接下来8个字符即为4字节的value。
  • 说明2:输入字符串中,每一组TLV紧密排列,中间无空格等分隔符

第二行:需要匹配的tag数量n(0 < n < 1000)
后面N行:需要匹配n个tag值(十进制表示),递增排列。

三、输出描述

和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。

四、解题思路

  1. 第一行:一个字符,代表收到的消息包;
  2. 第二行:需要匹配的tag数量n(0 < n < 1000);
  3. 后面N行:需要匹配n个tag值(十进制表示),递增排列;
  4. 定义哈希表,存储tag对应的length和valueOffset;
  5. 解析字符串msg,初始化哈希表;
    • 将16进制字符串转换为整数;
    • 计算valueOffset;
    • 跳过value,更新i;
    • 如果i超出msg长度,跳出循环;
    • 将tag、length、valueOffset存入tagMap中;
  6. 遍历tags,输出匹配结果。

五、Java算法源码

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");
            }
        }
    }
}

六、效果展示

1、输入

0F04ABABABAB
1
15

2、输出

4 2

3、说明

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

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

LeetCode:2316. 统计无向图中无法互相到达点对数(C++)

目录 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 实现代码与解析&#xff1a; 并查集 原理思路&#xff1a; 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为…

stable diffusion如何解决gradio外链无法开启的问题

问题确认 为了确认gradio开启不了是gradio库的问题还是stable diffusion的问题&#xff0c;可以先执行这样一段demo代码 import gradio as grdef greet(name):return "Hello " name "!"demo gr.Interface(fngreet, inputs"text", outputs&q…

Spring Cloud 之 Sentinel简介与GATEWAY整合实现

简介 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 熔断 …

Damask使用指南-Hcp结构(镁(考虑孪晶))孪晶如何加入

1&#xff0c;首先利用geom布种子&#xff0c;种子数为40&#xff0c;模型空间尺寸为64*64*1&#xff08;表示二维平面问题&#xff09;代码&#xff1a; 2&#xff0c;根据布种区域生成voronoi镶嵌的晶体结构 代码&#xff1a; 3 检查结构是否正确生成 4&#xff0c;利用dama…

61 不同路径

不同路径 重点&#xff1a;从左上角移动到右下角&#xff0c;m-1次向右&#xff0c;n-1次向下题解1 DP降维——滚动数组 题解2 求解组合 C m n − 2 m − 1 C^{m-1}_{mn-2} Cmn−2m−1​的值 一个机器人位于一个 m x n 网格的 左上角 &#xff08;起始点在下图中标记为 “St…

自己动手写编译器:c 语言模板中的输入模块设计

使用过“框架”的同学都能感受到“框架”带来的方便。所谓”框架“本质上就是一系列代码安排帮助我们完成脏活累活&#xff0c;或者复杂的工作流程后&#xff0c;把处理结果交给我们提供的代码。本节我们要完成的 c 语言模板也是一个框架&#xff0c;它也需要做一系列脏活累活&…

鲲鹏+麒麟V10 mysql8.0适配

检查是否已安装数据库服务 for i in rpm -qa | grep mysql;do rpm -e --nodeps $i;done yum源地址&#xff1a; http://repo.mysql.com/yum/mysql-8.0-community/el/8/aarch64/ 配置yum源&#xff1a; 将mysql相关的rpm包都下载到指定文件里&#xff0c;留作以后考用 yum reins…

UE4 距离场

在项目设置的渲染模块可打开距离场 把该节点连上&#xff0c;该节点的意思是&#xff0c;距离表面越近&#xff0c;材质显示值为0 不接近表面时&#xff1a; 接近表面时 可勾选该值即可看到距离场具体效果&#xff1a; 未接触表面时&#xff1a; 接触表面时&#xff1a; 产生…

2024年仁爱学院专升本招生专业对应范围专业目录更新的通知

天津仁爱学院2024年高职升本科招生专业对应范围专业目录 为了更好的进行天津仁爱学院专升本工作&#xff0c;动画专业不分文理进行录取。为了进一步提升录取专业的培养需要&#xff0c;请同学们复习专业课时加强专业课学习&#xff0c;请同学们在报考时关注天津仁爱学院招生章…

DLP是如何防止数据泄露的?

根据相关调查数据&#xff0c;未来五年全球企业数据泄露防护&#xff08;DLP&#xff09;市场预计将以21.03%的复合年增长率高速增长&#xff0c;到2026年市场规模将达到62.65亿美元。 PC访问地址&#xff1a;获取详细资料 https://isite.baidu.com/site/wjz012xr/2eae091d-1b…

2023年金九银十面经,假的今年没有金九银十

24岁的我选择了裸辞 前言 说实话选择裸辞后很迷茫&#xff0c;但是又不想在原本的公司上班&#xff0c;目前处于昏昏沉沉的状态&#xff0c;工作也是混一天是一天&#xff0c;没有了什么明确的目标&#xff0c;不知道屏幕前的你们有没有这种感觉,目前想着休息一段时间&#xff…

基础框架 Spring

引言 我们常说&#xff0c;Java 程序员不会 Spring&#xff0c;那还叫 Java 程序员吗&#xff1f;由此可见Spring在Java领域的重要性&#xff0c;本章我们就来谈谈 Spring 到底是何方神圣&#xff1f; 一、Spring 核心概念&#xff08;重要&#xff09; 1、Spring 是什么&am…

RGB彩色图、Depth深度图

&#x1f4a6;彩色图&#xff0c;深度图——》信息缺乏。如&#xff0c;颜色相近导致位置信息丢失 &#x1f4a6;深度图——》相近深度的物体&#xff0c;因为颜色或纹理的丢失&#xff0c;导致难区分 深度图并不可以直接使用&#xff0c; 因为深度图只能反映出了物体在三维空…

Oracle数据库完整卸载的完整步骤

时间&#xff1a;2023-03-15来源&#xff1a;系统城装机大师作者&#xff1a;佚名 1、停止所有Oracle服务 进入计算机管理&#xff0c;在服务中&#xff0c;找到oracle开头的所有服务&#xff0c;右击选择停止。 快捷键&#xff1a;ctrlshiftesc打开任务管理器 文章来源 Or…

PACS(Picture Archiving and Communications System)图像存储与传输系统源码

PACS&#xff08;Picture Archiving and Communications System&#xff09;——图像存储与传输系统&#xff0c;和医院信息化及数字化的目标紧密关联&#xff0c;它是专门为现代化医院的影像管理而设计的包括数字化医学图像信息的采集、显示、处理、存储、诊断、输出、管理、查…

蓝牙资讯|AirPods Pro 2推送新固件,苹果Find My功能受到好评

苹果公司今天面向采用 Lightning 端口和 USB-C 端口的 AirPods Pro 2 耳机&#xff0c;更新推出了内部编号为 6A305 的全新固件&#xff0c;高于 10 月 10 日发布的 6A303 更新。 苹果官方并没有公布固件的更新日志&#xff0c;目前尚不清楚具体引入了哪些新功能、新特性。苹…

【Rust 易学教程】学前准备:Cargo, 你好

当你开始学习 Rust 时&#xff0c;很快就会遇到 Cargo&#xff0c;它是 Rust 生态系统中用于构建和运行 Rust 应用程序的标准工具。在 《Rust 易学教程》 首篇中&#xff0c;我会简要概述一下 Cargo 是什么&#xff0c;以及它如何适应更广泛的生态系统。 安装 请按照 https:/…

[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。

类和对象下&#xff08;this指针补充&#xff09; 类和对象中构造函数和析构函数 一.this补充&#xff1a;1.概念总结&#xff1a;2.两个问题&#xff1a; 二.构造函数和析构函数&#xff1a;一.类的默认构造&#xff1a;1.初始化和清理&#xff1a;2.拷贝复制&#xff1a;3.取…

数据结构: AVL树

目录 1.AVL树的概念 2.AVL树的模拟实现 AVL树的结构定义 插入 对平衡因子的讨论 旋转 对旋转情况的讨论 1.单旋 1.1左单旋 1.2右单旋 2.双旋 2.1左右双旋 2.2右左双旋 检查是否是AVL树 1.AVL树的概念 当向二叉搜索树中插入新结点后&#xff0c;如果能保证每个结点…

STM32F4XX之串口

一、标准串口&#xff08;UART&#xff09;介绍 1、通信协议相关概念 1.1同步通信和异步通信 (1)同步通信&#xff1a;两个器件之间共用一个时钟线&#xff0c;要发送的数据在时钟的作用下一位一位发送出去。 &#xff08;2&#xff09;异步通信&#xff1a;指两个器件之间没…