文档特征提取2026 华为OD机试真题 4月22日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述一篇文档由多个文本片段组成这里假定每个片段由小写英文字母组成不包含其他内容需要针对该文档的多个片段进行特征提取提取方法如下1、特征提取处理时首先找出所有片段中都包含的字母也就是该字母在所有片段中都至少出现过一次。2、如果某个字母在多个片段中都出现过则计算字母在所有片段中出现的最小次数如果最小次数为1 11则特征中包含1 11个该字母如果最少次数为2 22则特征中包含2 22个该字母以此类推。3、最终输出的文本特征是具备上诉条件所有字母的集合且字母按照从小到大排序。4、如果所有的字母都不符合该条件则提取特征的结果为空。补充说明用例中字符串即片段的总数小于1000 10001000个示例1输入paper parent parade输出aepr说明“p”, “a”, “e”, “r” 在每个字符串中都至少出现一次.每个字母在各字符串中都至少出现1次所以结果中每个字母出现一次示例2输入hello hollow halloween输出hllo说明“h” 在每个字符串中都至少出现11次 → 取最小值11次“l” 在三个字符串中分别出现22次、22次、22次 → 最小值22次“o” 在三个字符串中分别出现11次、22次、11次 → 最小值11次所以结果为hllo示例3输入abc def ghi输出说明没有字母在所有三个字符串中都出现解题思路核心思想统计字符频率对每个输入的文本片段统计其中每个小写字母出现的次数。寻找共有字母遍历所有片段找出在所有片段中都出现过的字母。取最小值对于每一个共有字母计算它在所有片段中出现次数的最小值k kk。构建结果将每个共有字母重复k kk次并按字母表顺序从小到大拼接成最终的特征字符串。边界处理如果没有共有字母则输出空字符串。复杂度分析时间复杂度O ( N ⋅ L 26 ⋅ N ) O(N \cdot L 26 \cdot N)O(N⋅L26⋅N)其中N NN是片段数量L LL是片段的最大长度。统计每个片段的字符频率需要O ( N ⋅ L ) O(N \cdot L)O(N⋅L)遍历 26 个字母并查找最小值需要O ( 26 ⋅ N ) O(26 \cdot N)O(26⋅N)。空间复杂度O ( N ⋅ 26 ) O(N \cdot 26)O(N⋅26)用于存储每个片段的字符频率统计。Javaimportjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 读取整行输入包含多个文本片段if(!sc.hasNextLine())return;Stringlinesc.nextLine();// 按照空格分割成多个片段String[]fragmentsline.split(\\s);if(fragments.length0){System.out.println();return;}// 统计每个片段中每个字母a-z出现的频率int[][]countsnewint[fragments.length][26];for(inti0;ifragments.length;i){for(charc:fragments[i].toCharArray()){if(cacz){counts[i][c-a];}}}StringBuildersbnewStringBuilder();// 依次遍历 26 个小写英文字母for(intj0;j26;j){intminCountInteger.MAX_VALUE;// 找出该字母在所有片段中出现的最小次数for(inti0;ifragments.length;i){minCountMath.min(minCount,counts[i][j]);}// 如果最小次数大于 0说明该字母在所有片段中都出现过if(minCount0minCount!Integer.MAX_VALUE){// 将该字母按最小次数加入结果集合for(intk0;kminCount;k){sb.append((char)(aj));}}}Stringresultsb.toString();// 如果没有符合条件的字母输出双引号 if(result.isEmpty()){System.out.println(\\);}else{System.out.println(result);}}}Pythonimportsysdefsolve():# 从标准输入读取一行并去除首尾空格linesys.stdin.readline().strip()ifnotline:return# 按照空格分割成多个片段fragmentsline.split()ifnotfragments:print()return# 统计每个片段中 26 个字母的频率counts[]forfraginfragments:freq[0]*26forcharinfrag:ifacharz:freq[ord(char)-ord(a)]1counts.append(freq)result[]# 遍历 a-z 的每个索引foriinrange(26):# 计算该字母在所有片段中出现的最小次数min_countmin(count[i]forcountincounts)ifmin_count0:# 将该字母重复 min_count 次并存入结果列表result.append(chr(ord(a)i)*min_count)# 拼接最终结果字符串res_str.join(result)ifnotres_str:print()else:print(res_str)if__name____main__:solve()JavaScriptconstreadlinerequire(readline);// 创建逐行读取接口constrlreadline.createInterface({input:process.stdin,output:process.stdout,terminal:false});rl.on(line,(line){if(!line.trim())return;// 按空格拆分片段constfragmentsline.trim().split(/\s/);if(fragments.length0){console.log();return;}// 统计每个片段中每个字母的出现频率constcountsfragments.map(frag{constfreqnewArray(26).fill(0);for(letcharoffrag){if(characharz){freq[char.charCodeAt(0)-a.charCodeAt(0)];}}returnfreq;});letresult;// 遍历 26 个字母for(leti0;i26;i){letminCountInfinity;// 找到该字母在所有片段中出现的最小次数for(letj0;jcounts.length;j){minCountMath.min(minCount,counts[j][i]);}// 如果最小次数大于 0说明该字母是所有片段的共有特征if(minCount0minCount!Infinity){// 将该字母重复 minCount 次添加到结果中resultString.fromCharCode(a.charCodeAt(0)i).repeat(minCount);}}// 输出结果若为空则输出 if(result){console.log();}else{console.log(result);}});C#includeiostream#includevector#includestring#includesstream#includealgorithm#includeclimitsusingnamespacestd;intmain(){string line;// 读取一行输入if(!getline(cin,line))return0;stringstreamss(line);string fragment;vectorvectorintcounts;// 逐个读取片段并统计字母频率while(ssfragment){vectorintfreq(26,0);for(charc:fragment){if(cacz){freq[c-a];}}counts.push_back(freq);}if(counts.empty()){cout\\endl;return0;}string result;// 遍历 26 个小写字母for(inti0;i26;i){intminCountINT_MAX;// 计算该字母在所有片段中的最小出现次数for(constautofreq:counts){minCountmin(minCount,freq[i]);}// 如果在所有片段中都出现过if(minCount0minCount!INT_MAX){// 将字母按最小次数重复拼接到结果中for(intk0;kminCount;k){result(char)(ai);}}}// 输出最终提取的特征集合if(result.empty()){cout\\endl;}else{coutresultendl;}return0;}Gopackagemainimport(bufiofmtosstrings)funcmain(){// 使用 bufio 读取整行输入scanner:bufio.NewScanner(os.Stdin)if!scanner.Scan(){return}line:scanner.Text()// 将输入拆分为多个文本片段fragments:strings.Fields(line)iflen(fragments)0{fmt.Println(\\)return}// 统计每个片段中 26 个小写字母的频率counts:make([][26]int,len(fragments))fori,frag:rangefragments{for_,char:rangefrag{ifcharacharz{counts[i][char-a]}}}varresult strings.Builder// 依次检查 26 个字母fori:0;i26;i{minCount:1000000// 初始化为一个较大的值forj:0;jlen(fragments);j{ifcounts[j][i]minCount{minCountcounts[j][i]}}// 如果该字母在所有片段中都至少出现过一次ifminCount0minCount!1000000{// 将该字母按最小次数重复写入结果fork:0;kminCount;k{result.WriteByte(byte(ai))}}}resStr:result.String()// 如果结果为空输出 ifresStr{fmt.Println(\\)}else{fmt.Println(resStr)}}C语言#includestdio.h#includestring.h#includestdlib.h#includelimits.h#defineMAX_FRAGMENTS1000#defineMAX_LEN10000intmain(){charline[MAX_LEN];// 读取一整行输入if(fgets(line,sizeof(line),stdin)NULL)return0;// 去除末尾的换行符line[strcspn(line,\r\n)]0;intcounts[MAX_FRAGMENTS][26]{0};intfragmentCount0;// 使用 strtok 按空格分割字符串char*tokenstrtok(line, );while(token!NULLfragmentCountMAX_FRAGMENTS){intlenstrlen(token);for(inti0;ilen;i){if(token[i]atoken[i]z){counts[fragmentCount][token[i]-a];}}fragmentCount;tokenstrtok(NULL, );}if(fragmentCount0){printf(\\\n);return0;}charresult[MAX_LEN];intpos0;// 遍历 26 个字母寻找共有特征for(inti0;i26;i){intminCountINT_MAX;for(intj0;jfragmentCount;j){if(counts[j][i]minCount){minCountcounts[j][i];}}// 如果在所有片段中都出现按最小次数重复该字母if(minCount0minCount!INT_MAX){for(intk0;kminCount;k){result[pos]ai;}}}result[pos]\0;// 输出最终结果if(strlen(result)0){printf(\\\n);}else{printf(%s\n,result);}return0;}完整用例用例1paper parent parade用例2hello hollow halloween用例3abc def ghi用例4apple banana orange用例5aaaa bbbb cccc用例6aaaa aaaa aaaa用例7abcabc abc abc用例8xyz zyx yzx用例9a b c d e f用例10p p p p p文章目录文档特征提取题目描述补充说明示例1示例2示例3解题思路核心思想复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10