做視頻在哪個網(wǎng)站找素材網(wǎng)站搭建模板
題目
兩端通過TLVQ格式的報文來通信,現(xiàn)在收到對端的一個TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。具體要求如下:
(1)消息包中多組tag、length、value緊密排列,其中tag,length各占1字節(jié)(uint8),value所占字節(jié)數(shù)等于length的值
(2) 結(jié)果數(shù)組中tag值已知,需要填充每個tag對應(yīng)數(shù)據(jù)的length和valueOffset值(valueOffset為value在原消息包中的起始偏移量(從0開始,以字節(jié)為單位),即將消息包中的tag與結(jié)果數(shù)組中的tag進(jìn)行匹配(可能存在匹配失敗的情況,若結(jié)果數(shù)組中的tag在消息包中找不到,則ength和valueOffset都為0)
(3) 消息包和結(jié)果數(shù)組中的tag值都按升序排列,且不重復(fù)
(4) 此消息包未被篡改,但尾部可能不完整,不完整的一組TLV請丟棄掉
輸入描述
第一行:—個字符串,代表收到的消息包。字符串長度在10000以內(nèi)。
說明1:字符串使用十六進(jìn)制文本格式(字母為大寫)來展示消息包的數(shù)據(jù),如0F04ABABABAB代表一組TLV.前兩個字符(0F)代表tag值為15,接下來兩個字符(04)代表length值為4字節(jié),接下來8個字符即為4字節(jié)的value。
說明2:輸入字符串中,每一組TLV緊密排列,中間無空格等分隔符
第二行:需要匹配的tag數(shù)量n (0 <n <1000).
后面n行:需要匹配的n個tag值(十進(jìn)制表示),遞增排列。
輸出描述
需要匹配的n個tag對應(yīng)的n行匹配結(jié)果,每—行由長度和偏移量組成
示例1:
輸入
0F04ABABABAB
1
15
輸出
4 2
說明
tag15(十六進(jìn)制0F)對應(yīng)數(shù)據(jù)的長度為4,其value從第三個字節(jié)開始,因此偏移量為2
示例2:
輸入
0F04ABABABAB1001FF
2
15
17
輸出
4 2
0 0
說明
第二個tag匹配失敗
思路
本題比較容易,但是細(xì)節(jié)分析比較繁瑣,容易出錯
新建一個TLV對象,含有3個屬性tag,length以及offset。
遍歷輸入的第一行content,i的初始值為0。
第一個tag:content.subStr(i,i+2),利用Integer.parseInt將16進(jìn)制字符串轉(zhuǎn)為數(shù)字即可
第一個length: content.subStr(i+2,i+4)
第一個的offset為起始字符的索引/2:(i+4)/2
接下來的字符內(nèi)容:content.subStr(i+4,i+4+2*length),也就是說下一個TLV對象的起始索引值為:i+4+2*length,
因為題目要求了“不完整的一組TLV請丟棄掉”,即上述計算出來的tag或者length或者offset任意一個不存在,那么就不加入這個對象(只有當(dāng)數(shù)組的索引越界時才會不存在)
接下來得到了兩個排序的對象,list<TLV>以及nums
遍歷nums,假設(shè)當(dāng)前nums到 j 位置,list到 i 位置:
- 如果nums[i]>list.get(j).getTag():那么可以循環(huán)將j++,直到查找到下一個不大于nums[i]的位置,
- 如果list都遍歷完了都沒有找到,說明nums[i]大于list中的所有tag,此時直接將i位置的結(jié)果置為:0,0即可
- 如果循環(huán)后,nums[i]<list.get(j).getTag(),那么也說明找不到nums[i],直接將i位置的結(jié)果置為:0,0
- 如果循環(huán)后,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機(jī)試真題及題解(JAVA),查看當(dāng)前專欄更新的所有題目。