华为OD机考算法题:TLV解码

这篇具有很好参考价值的文章主要介绍了华为OD机考算法题:TLV解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目部分

解析与思路

代码实现


题目部分

题目 TLV编码
难度
题目说明 TLV编码是按 [Tag Length Value] 格式进行编码的,一段码流中的信元用 Tag 标识,Tag 在码流中唯一不重复,Length 表示信元Value的长度,Value 表示信元的值。
码流以某信元的 Tag 开头,Tag 固定占一个字节,Length 固定占两个字节,字节序为小端序。
现给定 TLV 格式编码的码流,以及需要解码的信元 Tag,请输出该信元的 Value。
输入码流的 16 机制字符中,不包括小写字母,且要求输出的 16 进制字符串中也不要包含小写字母;码流字符串的最大长度不超过 50000 个字节。
输入描述 输入的第一行为一个字符串,表示待解码信元的 Tag;
输入的第二行为一个字符串,表示待解码的 16 进制码流,字节之间用空格分隔。
输出描述 输出一个字符串,表示待解码信元以 16 进制表示的 Value。
补充说明

---------------------------------------------------------------------------------------

示例
示例1
输入 31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC
输出 32 33
说明 需要解析的信元的 Tag 是 31,从码流的起始处开始匹配,Tag 为 32 的信元长度为 1 (01 00,小端序表示为 1);
第二个信元的 Tag 是 90,其长度为 2;
第三个信元的 Tag 是 30,其长度为 3;
第四个信元的 Tag 是 31,其长度为 2(02 00),所以返回长度后面的两个字节即可,即 32 33。

解析与思路

题目解读

题目中,有两行输入。其中第二行是 TLV 信息流。TLV 信息流由多个信元组成,每个信元又由 Tag、Length、Value 组成;第一行是 Tag,即一个 TLV 信元的 Tag。

题目要求从第二行的多个信元中,找到第一行的 Tag 所对应的信元。然后输出此信元的 Value。

在输入示例中,第一行指定了信元的 Tag 是31,第二行输入的信息流包含了 5个 信元,依次为32、90、30、31、33。我们找到 Tag 为 31 的信元,它为 31 02 00 32 33,其中 31 是 Tag,02 00(即2)是长度,那么其紧跟的 2 个字节 32 33 为 Value,所以最终的结果输出为 32 33。

分析与思路

此题根据指定的 Tag,从信息流中找到对应的信息员,输出其 Value即可,并不涉及太复杂的逻辑算法。实现如下:

1. 记录第一行输入的数字,设为变量 Tag。
2. 逐一遍历第二行输入的信息流。遍历时,先判断第一个输入是否等于tag:

  • 如果等于 Tag,则继续遍历接下来的 2 个字节,(根据小端序)计算长度,设为变量 length,然后输出接下来的 length 个字节,即为最终输出。输出后退出程序。
  • 如果不等于 Tag,则继续遍历接下来的2个字节,计算长度,设为变量 length,然后跳过接下来的 length 个字节,然后继续步骤 2。

此算法只需要遍历一次第二行的输入,时间复杂度为 O(n),只需要2个额外的辅助变量,空间复杂度为 O(1)。


代码实现

Java代码

import java.util.Scanner;

/**
 * TLV解码
 * @since 2023.09.04
 * @version 0.2
 * @author Frank
 *
 */
public class LTV_Solution {
	public static void main(String[] args) {		
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {			
			// 第一行输入的tag
			String tag = sc.nextLine();
			
			// 第二行输入的TLV数据流
			String stream = sc.nextLine();
			String[] tlvStream = stream.split(" ");
			processLTVSolution( tag, tlvStream );
		}
	}
	
	private static void processLTVSolution( String tag, String tlvStream[] )
	{
		int i = 0;
		while (i < tlvStream.length) {
			String tagTmp = tlvStream[i];

			String lengthStr = tlvStream[i + 2] + tlvStream[i + 1];
			int length = Integer.parseInt(lengthStr, 16);

			// 已找到,输出
			if ( !tagTmp.equals( tag )) {
				// 没有找到Tag,略过,寻找下一个
				i += ( 3 + length);
				continue;
			}
			StringBuilder outputSB = new StringBuilder();
			for (int j = 0; j < length; j++) {
				outputSB.append(tlvStream[i + j + 3]);
				if (j != length - 1) {
					outputSB.append(" ");
				}
			}
			System.out.println(outputSB.toString());
			return;
		}
	}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        // 第一行数据
        var tag = line;        
        // 第二行数据转换成数组
        line = await readline();
        var ltvs = line.split(" ");
        processLTVSolution(tag, ltvs);
    }

}();

function processLTVSolution(tag, ltvs) {
    var i = 0;
    while (i < ltvs.length) {
        var tagTmp = ltvs[i];
        var lengthStr = ltvs[i + 2] + ltvs[i + 1];
        var length = parseInt(lengthStr, 16);

        // 没有找到Tag,略过,寻找下一个
        if (tagTmp != tag) {            
            i += (3 + length);
            continue;
        }

        // 已找到,输出
        var output = "";
        for (var j = 0; j < length; j++) {
            output += (ltvs[i + j + 3]);
            if (j != length - 1) {
                output += " ";
            }
        }
        console.log(output);
        return;
    }
}

(完)文章来源地址https://www.toymoban.com/news/detail-701502.html

到了这里,关于华为OD机考算法题:TLV解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机考算法题:MVP争夺战

    题目部分 解读与分析 代码实现 题目 MVP争夺战 难度 易 题目说明 在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP。 MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都

    2024年02月09日
    浏览(33)
  • 华为OD机考算法题:数字加减游戏

    题目部分 解读与分析 代码实现 题目 数字加减游戏 难度 难 题目说明 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t 。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减,分别为 a, b (a≠b),其中 b 没有使用

    2024年02月09日
    浏览(39)
  • 华为OD机考算法题:阿里巴巴找黄金宝箱(1)

    题目 阿里巴巴找黄金宝箱(1) 难度 易 题目说明 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从 0 ~ N 的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之

    2024年02月07日
    浏览(45)
  • 华为OD机考算法题:根据某条件聚类最少交换次数

    题目部分 解读与思路 代码实现 题目 根据某条件聚类最少交换次数 难度 难 题目说明 给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。 组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。 数据范围 -100 =K = 100 -100 = 数组中数值 = 100 输入描

    2024年02月09日
    浏览(36)
  • 华为OD机试 - TLV解析Ⅰ(Java & JS & Python)

    题目描述 TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。 码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,字节序为 小端序 。 现给定TLV格式编码的码流,以及

    2024年02月11日
    浏览(53)
  • 【华为OD机考 统一考试机试C卷】特殊的加密算法(C++ Java JavaScript Python C语言)

    真题目录:华为OD机考机试 真题目录( D卷 +C卷 + B卷 + A卷) + 考点说明 在线OJ:点击立即刷题,模拟真实机考环境 华为OD面试真题精选:华为OD面试真题精选 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。 规则如下: 明文为一段

    2024年04月16日
    浏览(45)
  • 【华为OD机考 统一考试机试C卷】素数之积/RSA加密算法(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年03月21日
    浏览(46)
  • 华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

    很多小伙伴问我,华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 我觉得可以按照“算法和数据结构”去刷,把华为OD机试涉及到的“算法和数据结构”列出来,一个算法刷10道题,那我岂不是无敌了? 首先,了解算法和数据结构有哪些知识点,在后面的刷题

    2024年02月14日
    浏览(38)
  • 【华为OD机考 统一考试机试C卷】数据最节约的备份方法(C++ Java JavaScript Python)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月02日
    浏览(79)
  • 【华为OD机考 统一考试机试C卷】多段线数据压缩(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包