建设银行跨行转账网站,百度浏览器网页,做外贸需要用什么网站,只做山寨的网站目录
题目部分
解析与思路
代码实现 题目部分
题目TLV编码题目说明TLV编码是按[Tag Length Value]格式进行编码的#xff0c;一段码流中的信元用Tag标识#xff0c;Tag在码流中唯一不重复#xff0c;Length表示信元Value的长度#xff0c;Value表示信元的值。 码流以某…目录
题目部分
解析与思路
代码实现 题目部分
题目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的信元长度为101 00小端序表示为1 第二个信元的Tag是90其长度为2 第三个信元的Tag是30其长度为3 第四个信元的Tag是31其长度为202 00所以返回长度后面的两个字节即可即32 33。 解析与思路
题目解读
题目中输入的第二行是TLV信息流。TLV信息流由多个信元组成而每个信元由Tag、Length、Value组成输入第一行是Tag即需要从第二行数据流中输出信元 Value 所对应的 Tag。
题目要求从第二行的多个信元中找到第一行的Tag所对应的信元。然后输出此信元的Value。
在输入示例中第一行指定了信元的Tag是31第二行输入的信息流包含了5个信元依次为32、90、30、31、33。我们找到Tag为31的信元它为 31 02 00 32 33其中 31 是Tag02 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.1* author Frank**/
public class LTV_Solution {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 第一行输入的tagString tag sc.nextLine();// 第二行输入的TLV数据流String stream sc.nextLine();String[] input stream.split( );int i 0;while (i input.length) {String tagTmp input[i];String lengthStr input[i 2] input[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(input[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() {let input [];while (line await readline()) {input.push(line);}// 第一行数据var tag input[0];// 第二行数据转换成数组var ltvs input[1].split( );var i 0;while (i ltvs.length) {var tagTmp ltvs[i];var lengthStr ltvs[i 2] ltvs[i 1];var length parseInt(lengthStr, 16);// 已找到输出if (tagTmp ! tag ) {// 没有找到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;}
}();
(完)