不同Tag类型统计(C/Go/C/Js/Java/Py)题解华为OD机试新系统真题 华为OD上机考试新系统真题 7月22号 100分题型华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录机考题库 算法考点详解题目内容给定一个数组元素为数字数组的内容表示多个连续的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题解思路模拟初始化index 0从前往后遍历依次确定各个部分的值以及进行合法性检验tag[index]为该TLV的tag判断index 1 n确保length片段没有丢失并得到length的值通过length的值可以得到整个TLV的长度为tagLen (2 length 3) / 4 * 4,并检查index tagLen n确保剩余片段是否能组成完成TLV检验[index, index tagLen -1]的值是否满足[0,99]使用集合或者数组保存出现过的tag更新index tagLen重复执行以上策略按照2模拟处理输入tag无不合法情况下输出tag种类即可。c#includebits/stdc.h#includestring#includevectorusingnamespacestd;// 通用 切割函数 函数 将字符串str根据delimiter进行切割vectorintsplit(conststringstr,conststringdelimiter){vectorintresult;size_t start0;size_t endstr.find(delimiter);while(end!string::npos){result.push_back(stoi(str.substr(start,end-start)));startenddelimiter.length();endstr.find(delimiter,start);}// 添加最后一个部分result.push_back(stoi(str.substr(start)));returnresult;}intcountTagCategories(vectorinttag){// 用于tag去重setints;intntag.size();intindex0;while(indexn){// 不完整不包含lengthif(index1n){return0;}intlengthtag[index1];// 不符合length 0要求if(length0){return0;}// 补齐之后tag的实际长度inttagLen(2length3)/4*4;// 剩余长度无法满足完整tag要求if(indextagLenn){return0;}// 检验值范围是否合法for(intjindex;jindextagLen;j){if(tag[j]0||tag[j]99){return0;}}s.insert(tag[index]);indextagLen;}returns.size();}intmain(){string input;getline(cin,input);vectorinttagsplit(input,,);coutcountTagCategories(tag);return0;}Javaimportjava.util.*;publicclassMain{staticintcountTagCategories(int[]tag){// 用于tag去重SetIntegersetnewHashSet();intntag.length;intindex0;while(indexn){// 不完整不包含lengthif(index1n){return0;}intlengthtag[index1];// 不符合length 0要求if(length0){return0;}// 补齐之后tag的实际长度inttagLen((2length3)/4)*4;// 剩余长度无法满足完整tag要求if(indextagLenn){return0;}// 检验值范围是否合法for(intjindex;jindextagLen;j){if(tag[j]0||tag[j]99){return0;}}set.add(tag[index]);indextagLen;}returnset.size();}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringinputsc.nextLine();String[]arrinput.split(,);int[]tagnewint[arr.length];for(inti0;iarr.length;i){tag[i]Integer.parseInt(arr[i]);}System.out.println(countTagCategories(tag));}}Python# 用于tag去重defcountTagCategories(tag):sset()nlen(tag)index0whileindexn:# 不完整不包含lengthifindex1n:return0lengthtag[index1]# 不符合length 0要求iflength0:return0# 补齐之后tag的实际长度tagLen((2length3)//4)*4# 剩余长度无法满足完整tag要求ifindextagLenn:return0# 检验值范围是否合法forjinrange(index,indextagLen):iftag[j]0ortag[j]99:return0s.add(tag[index])indextagLenreturnlen(s)input_strinput().strip()taglist(map(int,input_str.split(,)))print(countTagCategories(tag))JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});functioncountTagCategories(tag){// 用于tag去重constsetnewSet();constntag.length;letindex0;while(indexn){// 不完整不包含lengthif(index1n){return0;}constlengthtag[index1];// 不符合length 0要求if(length0){return0;}// 补齐之后tag的实际长度consttagLenMath.floor((2length3)/4)*4;// 剩余长度无法满足完整tag要求if(indextagLenn){return0;}// 检验值范围是否合法for(letjindex;jindextagLen;j){if(tag[j]0||tag[j]99){return0;}}set.add(tag[index]);indextagLen;}returnset.size;}rl.on(line,function(line){consttagline.split(,).map(Number);console.log(countTagCategories(tag));});Gopackagemainimport(fmtstrconvstrings)funccountTagCategories(tag[]int)int{// 用于tag去重set:make(map[int]bool)n:len(tag)index:0forindexn{// 不完整不包含lengthifindex1n{return0}length:tag[index1]// 不符合length 0要求iflength0{return0}// 补齐之后tag的实际长度tagLen:((2length3)/4)*4// 剩余长度无法满足完整tag要求ifindextagLenn{return0}// 检验值范围是否合法forj:index;jindextagLen;j{iftag[j]0||tag[j]99{return0}}set[tag[index]]trueindextagLen}returnlen(set)}funcmain(){varinputstringfmt.Scanln(input)parts:strings.Split(input,,)tag:make([]int,len(parts))fori,s:rangeparts{tag[i],_strconv.Atoi(s)}fmt.Println(countTagCategories(tag))}C语言#includestdio.h#includestdlib.h#includestring.h#defineMAXN100000// 通用 切割函数 函数 将字符串str根据delimiter进行切割intsplit(char*str,constchar*delimiter,intnums[]){intcnt0;char*tokenstrtok(str,delimiter);while(token!NULL){nums[cnt]atoi(token);tokenstrtok(NULL,delimiter);}returncnt;}intcountTagCategories(inttag[],intn){// 用于tag去重intvis[100]{0};intindex0;while(indexn){// 不完整不包含lengthif(index1n){return0;}intlengthtag[index1];// 不符合length 0要求if(length0){return0;}// 补齐之后tag的实际长度inttagLen((2length3)/4)*4;// 剩余长度无法满足完整tag要求if(indextagLenn){return0;}// 检验值范围是否合法for(intjindex;jindextagLen;j){if(tag[j]0||tag[j]99){return0;}}vis[tag[index]]1;indextagLen;}intans0;for(inti0;i100;i){if(vis[i]){ans;}}returnans;}intmain(){charinput[MAXN];fgets(input,sizeof(input),stdin);input[strcspn(input,\n)]\0;inttag[MAXN];intnsplit(input,,,tag);printf(%d\n,countTagCategories(tag,n));return0;}