行业资讯

7.22华为OD机试真题 新系统 - 不同Tag类型统计 (Java/Py/C/C++/Js/Go)

发布时间:2026/7/27 22:44:25
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