【華為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),查看當前專欄更新的所有題目。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC 案例

文章目錄 前言1. 計算器1.1 準備前端代碼1.2 測試前端代碼1.3 完成后端代碼1.4 驗證程序 2. 留言板2.1 前端代碼準備2.2 測試前端代碼2.3 完成前后端交互代碼2.4 完成后端代碼2.5 案例測試2.6 完善前后端交互2.7 完善后端代碼2.8 完整功能測試 lombok簡單的方式添加Lombok工具3…

vue3使用mitt用于組件之間傳值

vue3已經沒有提供配套的事件總線bus&#xff0c;需要使用第三方庫mitt來完成vue2中bus完成的事情 1.安裝 npm install mitt2.引用 bus.js import mitt from mitt; const bus mitt(); export default bus;3.在需要使用的vue文件中導入bus import bus from ./mitt4.使用mitt…

HarmonyOS學習 第1節 DevEco Studio配置

俗話說的好&#xff0c;工欲善其事,必先利其器。我們先下載官方的開發工具DevEco Studio. 下載完成后&#xff0c;進行安裝。 雙擊DevEco Studio&#xff0c;點擊Next按照指引完成安裝 重新啟動DevEco&#xff0c;點擊 Agree 進入環境配置&#xff0c;安裝Node.js和ohpm 點擊Ne…

MQTT 協議入門:輕松上手,快速掌握核心要點

文章目錄 什么是 MQTT&#xff1f;MQTT 的工作原理MQTT 客戶端MQTT Broker發布-訂閱模式主題QoS MQTT 的工作流程開始使用 MQTT&#xff1a;快速教程準備 MQTT Broker準備 MQTT 客戶端創建 MQTT 連接通過通配符訂閱主題發布 MQTT 消息MQTT 功能演示保留消息Clean Session遺囑消…

【WPF】使用ObservableCollection解決:累積計數x與實際計數x不相同

使用觀察模式和集合 錯誤代碼 public List<IPAddress> iPAddressDevices new List<IPAddress>();public List<IPAddress> IPAddressDevices { get > iPAddressDevices; set {iPAddressDevices value;RaisePropertyChanged(nameof(IPAddressDevices));…

spring IOC介紹

spring的Ioc真是個好東西啊&#xff0c;那它到底是什么東西呢&#xff0c;控制反轉&#xff0c;到底是怎么轉的呢&#xff1f; 假設啊你現在是一個導演&#xff0c;想排部戲&#xff0c;那是不是得需要演員和舞臺(spring中的bean)&#xff0c;如果按平常的編程思維就是new 一個…

vue-baidu-map實現在地圖上選擇范圍并解決相關問題

vue-baidu-map實現在地圖上選擇范圍并解決相關問題 實現地圖上選擇不規則范圍實現功能遇到的問題1、覆蓋物多邊形怎么才能蓋住覆蓋物點2、遇到其他問題 實現地圖上選擇不規則范圍 這個功能比較簡單&#xff0c;只需要使用vue-baidu-map插件的覆蓋物多邊形功能就行了。直接看文…

Win10專業版找不到安全中心選項的解決方法

在Win10電腦中&#xff0c;安全中心功能起到很大的作用。但是&#xff0c;有用戶在Win10專業版電腦上找不到安全中心選項&#xff0c;從而影響到自己的正常使用。下面小編分享解決Win10專業版系統沒有安全中心的簡單方法&#xff0c;解決后在Win10專業版就能成功找到安全中心了…

哈希表及其基礎(java詳解)

目錄 一、哈希表基礎 二、哈希函數的設計 哈希函數的設計原則 三、java中的hashCode 基本數據類型的hashCode使用 自定義類型的hashCode使用 需要注意 四、哈希沖突的處理 鏈地址法Seperate Chaining 五、實現屬于我們自己的哈希表 六、哈希表的動態空間處理和復雜…

通過項目管理軟件監管新員工入職流程的方法與策略

項目管理軟件是什么&#xff1f;項目管理軟件都能做什么&#xff1f;是不是只有項目團隊需要啊&#xff1f;NO&#xff01;項目管理軟件乍聽其名不免讓人覺得這不過是個項目領域的專用工具。 那什么是項目呢&#xff1f;項目是為創造獨特的產品、服務或成果而進行的體系化的工…

物聯網+AI智慧工地云平臺源碼(SaaS模式)

智慧工地云平臺充分運用數字化技術&#xff0c;聚焦施工現場崗位一線&#xff0c;依托物聯網、互聯網、AI等技術&#xff0c;圍繞施工現場管理的人、機、料、法、環五大維度&#xff0c;以及施工過程管理的進度、質量、安全三大體系為基礎應用&#xff0c;實現全面高效的工程管…

stm32中滴答定時器與普通定時器的區別

1、兩者在單片機中的位置不一樣 滴答定時器在內核上&#xff0c;普通定時器在外設上。 由于位置不同&#xff0c;滴答定時器的程序可以移植到所有相同內核的芯片上&#xff0c;但普通定時器的程序卻不可以。 2、兩者的中斷優先級不一樣 滴答定時器優先級高&#xff0c;普通定…

CTF刷題記錄

刷題 我的md5臟了KFC瘋狂星期四坤坤的csgo邀請simplePHPcurl 我的md5臟了 g0at無意間發現了被打亂的flag&#xff1a;I{i?8Sms??Cd_1?T51??F_1?} 但是好像缺了不少東西&#xff0c;flag的md5值已經通過py交易得到了&#xff1a;88875458bdd87af5dd2e3c750e534741 flag…

關于微信/支付寶等平臺驗簽/簽名sign生成算法

引言 我們在日常工作中經常會遇到對接微信平臺、支付寶平臺、或者自己對外開放一個api服務&#xff0c;那么這里經常會出現一個名字&#xff1a;sgin&#xff08;簽名&#xff09;。 舉個栗子 這是微信支付統一下單接口文檔&#xff0c;最簡單的理解就是&#xff0c;服務端為…

Unirest-Java:Java發起GET、POST、PUT、DELETE、文件上傳,文件下載工具類介紹

一、簡介 Unirest-Java是一個輕量級的HTTP客戶端庫&#xff0c;用于在Java應用程序中發送HTTP請求。 它提供了簡單易用的API&#xff0c;可以方便地處理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持異步和同步請求&#xff0c;可以輕松地與JSON、XML等數據格式進行…

最優化方法復習——線性規劃之對偶問題

一、線性規劃對偶問題定義 原問題&#xff1a; 對偶問題&#xff1a; &#xff08;1&#xff09;若一個模型為目標求 “極大”&#xff0c;約束為“小于等于” 的不等式&#xff0c;則它的對偶模型為目標求“極小”&#xff0c;約束是“大于等于”的不等式。即“Max&#xff0…

2024年甘肅省職業院校技能大賽信息安全管理與評估三階段理論樣題一

2024年甘肅省職業院校技能大賽高職學生組電子與信息大類信息安全管理與評估賽項樣題一 第六部分 理論技能與職業素養&#xff08;100 分&#xff09; 【注意事項】 1.該部分答題時長包含在第三階段競賽時長內&#xff0c;請在臨近競賽結束前提交。 2.參賽團隊可根據自身情況…

數據庫系統概論復習資料

數據庫系統概論考試需知 一、分值分布 1、判斷題&#xff08;10分&#xff09; 1分一個 2、填空題&#xff08;20分&#xff09; 2分一個 3、選擇題&#xff08;20分&#xff09; 2分一個 4、分析題&#xff08;30分&#xff09; 第一題10分&#xff0c;第二題…

如何設置echart圖表在vue頁面屏幕比例縮放自適應問題

問題&#xff1a;頁面的echart圖表在瀏覽器縮放屏幕比例時無法隨著屏幕的比例自動改變大小 解決方式&#xff1a; 可以通過監聽窗口的 resize 事件&#xff0c;并在事件回調函數中重新調整圖表的大小。 <template><div ref"chartContainer" style"w…

Enterprise Architect 12版本使用教程

Enterprise Architect 12版本使用教程 1.下載安裝Enterprise Architect 122.Enterprise Architect原始DDL模板配置及存在的問題1.DDL Column Definition原始模板&#xff08;沒有default值&#xff1a;可忽略&#xff09;2.DDL Data Type原始模板&#xff08;timestamp等時間字…