7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)

7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)
字符串压缩编码2026 华为OD机试真题 7月12日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述给定一个只包含大小写英文字母的字符串请实现字符串压缩编码功能。压缩规则如果字符连续出现次数大于1则用字符加上出现次数表示如果字符连续出现次数等于1则直接输出字符输入描述输入一行包含一个字符串 str长度 1≤∣str∣≤1000字符串只包含大小写英文字母输出描述输出压缩后的字符串示例1输入aabcccccaaa输出a2bc5a3说明aa→a2b→b单个字符不写数字ccccc→c5aaa→a3示例2输入b输出b说明单个字符直接输出示例3输入AAbB输出A2bB说明AA→A2b→bB→B示例4输入aaabbbcccaaa输出a3b3c3a3说明aaa→a3bbb→b3ccc→c3aaa→a3解题思路核心思想字符串压缩编码采用双指针扫描的方式使用一个慢指针i指向当前连续段的起点一个快指针j向后扫描直到字符不同从而统计连续相同字符的个数。算法步骤边界处理若字符串为空直接返回空串。双指针扫描i指向当前连续段的起点j向右移动直到s[j]与s[i]不同或到达末尾。统计计数cnt j - i即为当前字符的连续出现次数。构建结果若cnt 1拼接字符 数字。若cnt 1只拼接字符。移动指针i j继续处理下一段。返回结果将所有片段拼接为最终字符串。复杂度分析时间复杂度O(n)其中 n 为字符串长度每个字符最多被访问两次。空间复杂度O(n)用于存储结果字符串。Javaimportjava.util.Scanner;publicclassMain{publicstaticStringcompress(Strings){intns.length();if(n0)return;StringBuilderresnewStringBuilder();inti0;// 双指针i 为当前段起点j 向后扩张直到字符改变while(in){intji;while(jns.charAt(j)s.charAt(i)){j;}intcntj-i;// 计数 1 才写数字单个字符只写字母if(cnt1){res.append(s.charAt(i)).append(cnt);}else{res.append(s.charAt(i));}ij;// 跳到下一段起点}returnres.toString();}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringssc.nextLine();System.out.println(compress(s));}}Pythondefcompress(s:str)-str:nlen(s)ifn0:returnres[]i0# 双指针i 为当前段起点j 向后扩张直到字符改变whilein:jiwhilejnands[j]s[i]:j1cntj-i# 计数 1 才写数字单个字符只写字母ifcnt1:res.append(f{s[i]}{cnt})else:res.append(s[i])ij# 跳到下一段起点return.join(res)if__name____main__:importsys ssys.stdin.read().strip()print(compress(s))JavaScript// 使用 readline 读取输入constreadlinerequire(readline);functioncompress(s){constns.length;if(n0)return;letres;leti0;// 双指针i 为当前段起点j 向后扩张直到字符改变while(in){letji;while(jns[j]s[i]){j;}constcntj-i;// 计数 1 才写数字单个字符只写字母if(cnt1){ress[i]cnt;}else{ress[i];}ij;// 跳到下一段起点}returnres;}constrlreadline.createInterface({input:process.stdin});letinput;rl.on(line,line{inputline;});rl.on(close,(){console.log(compress(input));});C#includeiostream#includestringusingnamespacestd;stringcompress(string s){intns.length();if(n0)return;string res;inti0;// 双指针i 为当前段起点j 向后扩张直到字符改变while(in){intji;while(jns[j]s[i]){j;}intcntj-i;// 计数 1 才写数字单个字符只写字母if(cnt1){ress[i]to_string(cnt);}else{ress[i];}ij;// 跳到下一段起点}returnres;}intmain(){string s;cins;coutcompress(s);return0;}Gopackagemainimport(bufiofmtosstrconvstrings)// compress 双指针扫描字符串进行压缩编码funccompress(sstring)string{n:len(s)ifn0{return}varres strings.Builder i:0// 双指针i 为当前段起点j 向后扩张直到字符改变forin{j:iforjns[j]s[i]{j}cnt:j-i// 计数 1 才写数字单个字符只写字母ifcnt1{res.WriteByte(s[i])res.WriteString(strconv.Itoa(cnt))}else{res.WriteByte(s[i])}ij// 跳到下一段起点}returnres.String()}funcmain(){reader:bufio.NewReader(os.Stdin)s,_:reader.ReadString(\n)sstrings.TrimRight(s,\r\n)fmt.Println(compress(s))}C语言#includestdio.h#includestring.h// compress 双指针扫描字符串进行压缩编码voidcompress(constchar*s,char*res){intnstrlen(s);if(n0){res[0]\0;return;}intidx0;// res 的写入位置inti0;// 双指针i 为当前段起点j 向后扩张直到字符改变while(in){intji;while(jns[j]s[i]){j;}intcntj-i;// 计数 1 才写数字单个字符只写字母if(cnt1){res[idx]s[i];// 将数字转换为字符串charbuf[12];sprintf(buf,%d,cnt);for(intk0;buf[k]!\0;k){res[idx]buf[k];}}else{res[idx]s[i];}ij;// 跳到下一段起点}res[idx]\0;}intmain(){chars[1001];scanf(%s,s);charres[2001];compress(s,res);printf(%s\n,res);return0;}完整用例用例1输入aabcccccaaa用例2输入b用例3输入AAbB用例4输入aaabbbcccaaa用例5输入abcdefg用例6输入aaaaaaaaaa用例7输入abababab用例8输入aAaAaA用例9输入zzzz...z(1000个z)用例10输入aaabbCCdddEEff文章目录字符串压缩编码题目描述输入描述输出描述示例1示例2示例3示例4解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10