7.22华为OD机试真题 新系统 - 不同Tag类型统计 (Java/Py/C/C++/Js/Go)
不同Tag类型统计2026 华为OD机试真题 7月22日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述给定一个数组元素为数字数组的内容表示多个连续的TLVtag-length-value关于TLV单个TLV具备以下特征tag占位1个数组元素代表类型length占位1个数组元素代表长度且长度值大于0value占位后面连续的length个数组元素tlv长度限制单个TLV所占的数组元素必须是4的倍数不足的部分可用任意数字补齐数值取值范围0-99例如单个TLV数组2130第一个数字2是tag第二个数字1是length第三个数字3是value第四个数字0是补齐现在要求把给定的数组进行分析解析出整个数组中存在多少种不同类型的tag如果解析过程出现数组元素不符合规范则返回0。输入描述数组元素不超过10000TLV的总数不超过1000。输出描述解析出的不同tag类型的数量若格式错误则输出0。示例1输入2,1,3,0,3,1,3,0,0输出0说明格式不对示例2输入2,1,3,0,3,1,3,0输出2说明格式正确2个Tag类型分别是2、3解题思路核心思想数组由若干个连续 TLV 块组成。每个 TLV 至少包含tag、length和length个value元素因此原始长度为2 length。由于单个 TLV 总占位必须是4的倍数所以需要把2 length向上补齐到最近的4的倍数。解析时从数组头部开始每次确定当前 TLV 的实际占位长度校验该段所有元素是否都在0到99之间并把当前tag加入集合。只要某一步无法继续解析直接输出0。算法步骤读取一行输入按英文逗号切分得到数组arr。使用指针index指向当前 TLV 的起始位置。如果当前位置后面没有length字段说明格式错误返回0。读取length arr[index 1]若length 0返回0。当前 TLV 原始长度为2 length补齐后的占位长度为((2 length 3) / 4) * 4。如果当前 TLV 补齐后会越过数组末尾返回0。检查当前 TLV 占用范围内的每个元素若不在0到99之间返回0。将arr[index]加入 tag 集合指针后移一个补齐后的 TLV 长度。当指针刚好走到数组末尾时返回集合大小。复杂度分析设数组长度为n。每个数组元素最多被检查一次时间复杂度为O(n)。需要使用集合保存不同 tag最多保存1000个 TLV 的 tag空间复杂度为O(k)其中k为不同 tag 数量。Javaimportjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Scanner;importjava.util.Set;publicclassMain{staticintsolve(int[]arr){// 从左到右解析连续 TLVindex 始终指向当前 tagintnarr.length;intindex0;SetIntegertagsnewHashSet();while(indexn){// 当前 TLV 至少需要 tag 和 length 两个字段if(index1n){return0;}intlengtharr[index1];// length 必须大于 0否则格式非法if(length0){return0;}// 原始长度为 tag、length、value整体向上补齐到 4 的倍数intrawSize2length;intpaddedSize(rawSize3)/4*4;if(indexpaddedSizen){return0;}// 当前 TLV 占用范围内的所有元素都必须在 0 到 99 之间for(intiindex;iindexpaddedSize;i){if(arr[i]0||arr[i]99){return0;}}tags.add(arr[index]);indexpaddedSize;}returntags.size();}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);Stringinputscanner.hasNextLine()?scanner.nextLine().trim():;ListIntegernumsnewArrayList();if(!input.isEmpty()){String[]partsinput.split(,);for(Stringpart:parts){Stringitempart.trim();if(!item.isEmpty()){nums.add(Integer.parseInt(item));}}}int[]arrnewint[nums.size()];for(inti0;inums.size();i){arr[i]nums.get(i);}System.out.println(solve(arr));}}Pythondefsolve(arr):# 从数组头部开始逐个解析 TLV 块nlen(arr)index0tagsset()whileindexn:# 当前 TLV 必须至少有 tag 和 lengthifindex1n:return0lengtharr[index1]# length 必须为正数iflength0:return0# 计算 TLV 补齐到 4 的倍数后的实际占位raw_size2length padded_size(raw_size3)//4*4ifindexpadded_sizen:return0# tag、length、value 和补齐元素都必须在 0 到 99 之间forvalueinarr[index:indexpadded_size]:ifvalue0orvalue99:return0tags.add(arr[index])indexpadded_sizereturnlen(tags)lineinput().strip()arr[]iflineelselist(map(int,line.split(,)))print(solve(arr))JavaScriptconstreadlinerequire(readline);functionsolve(arr){// 从左到右解析 TLVpos 表示当前 tag 的位置consttagsnewSet();letpos0;while(posarr.length){// 每个 TLV 至少需要 tag 和 length 两个元素if(pos1arr.length){return0;}constlengtharr[pos1];// length 必须大于 0if(length0){return0;}// 计算补齐到 4 的倍数后的 TLV 实际长度constrawSize2length;constpaddedSizeMath.floor((rawSize3)/4)*4;if(pospaddedSizearr.length){return0;}// 当前 TLV 占用范围内所有元素都必须合法for(letipos;ipospaddedSize;i){if(arr[i]0||arr[i]99){return0;}}tags.add(arr[pos]);pospaddedSize;}returntags.size;}constrlreadline.createInterface({input:process.stdin,output:process.stdout,terminal:false});constlines[];rl.on(line,(line)lines.push(line));rl.on(close,(){constinputlines.length0?lines[0].trim():;constarrinput?[]:input.split(,).map((item)Number(item.trim()));console.log(solve(arr));});C#includeiostream#includeset#includesstream#includestring#includevectorusingnamespacestd;intsolve(constvectorintarr){// 顺序扫描数组pos 始终表示当前 TLV 的 tag 位置intnstatic_castint(arr.size());intpos0;setinttags;while(posn){// 当前 TLV 至少包含 tag 和 lengthif(pos1n){return0;}intlengtharr[pos1];// length 必须为正数if(length0){return0;}// TLV 原始长度补齐到 4 的倍数后才是实际占位长度intrawSize2length;intpaddedSize(rawSize3)/4*4;if(pospaddedSizen){return0;}// 检查 tag、length、value 和补齐元素是否都在 0 到 99 之间for(intipos;ipospaddedSize;i){if(arr[i]0||arr[i]99){return0;}}tags.insert(arr[pos]);pospaddedSize;}returnstatic_castint(tags.size());}intmain(){string input;getline(cin,input);vectorintarr;stringstreamss(input);string item;while(getline(ss,item,,)){if(!item.empty()){arr.push_back(stoi(item));}}coutsolve(arr)endl;return0;}Gopackagemainimport(bufiofmtosstrconvstrings)funcsolve(arr[]int)int{// 从数组起点开始逐个解析 TLVpos:0tags:make(map[int]bool)forposlen(arr){// 每个 TLV 至少要有 tag 和 lengthifpos1len(arr){return0}length:arr[pos1]// length 必须大于 0iflength0{return0}// 计算补齐到 4 的倍数后的实际 TLV 长度rawSize:2length paddedSize:(rawSize3)/4*4ifpospaddedSizelen(arr){return0}// 当前 TLV 占用的所有数组元素都必须在 0 到 99 之间fori:pos;ipospaddedSize;i{ifarr[i]0||arr[i]99{return0}}tags[arr[pos]]truepospaddedSize}returnlen(tags)}funcmain(){scanner:bufio.NewScanner(os.Stdin)input:ifscanner.Scan(){inputstrings.TrimSpace(scanner.Text())}arr:make([]int,0)ifinput!{for_,part:rangestrings.Split(input,,){value,_:strconv.Atoi(strings.TrimSpace(part))arrappend(arr,value)}}fmt.Println(solve(arr))}C语言#includectype.h#includestdio.h#includestdlib.h#includestring.hintsolve(intarr[],intn){// 从左到右解析 TLVpos 指向当前 tagintpos0;intseen[100]{0};intcount0;while(posn){// 当前 TLV 至少需要 tag 和 lengthif(pos1n){return0;}intlengtharr[pos1];// length 必须大于 0if(length0){return0;}// 计算补齐到 4 的倍数后的实际占位长度intrawSize2length;intpaddedSize(rawSize3)/4*4;if(pospaddedSizen){return0;}// 当前 TLV 占用范围内的所有元素都必须在 0 到 99 之间for(intipos;ipospaddedSize;i){if(arr[i]0||arr[i]99){return0;}}if(!seen[arr[pos]]){seen[arr[pos]]1;count;}pospaddedSize;}returncount;}intmain(){charinput[50000];if(fgets(input,sizeof(input),stdin)NULL){input[0]\0;}intarr[10005];intn0;char*tokenstrtok(input,,);while(token!NULL){while(isspace((unsignedchar)*token)){token;}if(*token!\0){arr[n]atoi(token);}tokenstrtok(NULL,,);}printf(%d\n,solve(arr,n));return0;}完整用例用例12,1,3,0,3,1,3,0,0用例22,1,3,0,3,1,3,0用例35,2,7,8用例41,1,9,0,1,2,8,7,2,1,6,0用例54,3,1,2,3,0,0,0,6,1,7,0用例69,5,1,2,3,4,5,0,9,1,8,0用例71,0,5,0用例82,1,3,100用例92,1,-3,0用例100,1,1,0,99,2,1,2,15,4,1,2,3,4,0,0,50,1,9,0文章目录不同Tag类型统计题目描述输入描述输出描述示例1示例2解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10

相关新闻

多智能体协同AI图像翻译系统:跨境电商图片本地化解决方案

多智能体协同AI图像翻译系统:跨境电商图片本地化解决方案

1. 项目概述:多智能体协同的AI图像翻译系统 在跨境电商运营中,产品图片的本地化处理一直是个令人头疼的问题。传统做法需要人工团队协作:翻译负责文案转换,美工处理图片修复,设计师调整版式布局。整个过程耗时费力&…

2026/10/31 23:00:31 阅读更多 →
AI在电商内容生成与评价分析中的实践应用

AI在电商内容生成与评价分析中的实践应用

1. 电商内容生产的痛点与AI破局之道 电商行业正面临前所未有的"内容焦虑"。以某头部生鲜电商平台为例,其商品库中仅水果品类就超过2000种,每个SKU需要至少5种不同风格的描述文案(详情页、促销弹窗、社交媒体推广等)。传…

2026/11/1 17:25:40 阅读更多 →
深度解析Alfred工作流集合:构建高效Mac自动化生态

深度解析Alfred工作流集合:构建高效Mac自动化生态

深度解析Alfred工作流集合:构建高效Mac自动化生态 【免费下载链接】favoritesWorkflow4Alfred 项目地址: https://gitcode.com/GitHub_Trending/fa/favoritesWorkflow4Alfred favoritesWorkflow4Alfred是一个面向Mac用户的Alfred工作流精选集合,…

2026/11/2 2:17:03 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻