当前位置: 首页 > news >正文

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

说明

  • aaa2
  • bb(单个字符不写数字)
  • cccccc5
  • aaaa3

示例2

输入

b

输出

b

说明

  • 单个字符直接输出

示例3

输入

AAbB

输出

A2bB

说明

  • AAA2
  • bb
  • BB

示例4

输入

aaabbbcccaaa

输出

a3b3c3a3

说明

  • aaaa3
  • bbbb3
  • cccc3
  • aaaa3

解题思路

核心思想

字符串压缩编码采用双指针扫描的方式:使用一个慢指针i指向当前连续段的起点,一个快指针j向后扫描直到字符不同,从而统计连续相同字符的个数。

算法步骤

  1. 边界处理:若字符串为空,直接返回空串。
  2. 双指针扫描i指向当前连续段的起点,j向右移动直到s[j]s[i]不同或到达末尾。
  3. 统计计数cnt = j - i即为当前字符的连续出现次数。
  4. 构建结果
    • cnt > 1,拼接字符 + 数字
    • cnt == 1,只拼接字符。
  5. 移动指针i = j,继续处理下一段。
  6. 返回结果:将所有片段拼接为最终字符串。

复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串长度,每个字符最多被访问两次。
  • 空间复杂度:O(n),用于存储结果字符串。

Java

importjava.util.Scanner;publicclassMain{publicstaticStringcompress(Strings){intn=s.length();if(n==0)return"";StringBuilderres=newStringBuilder();inti=0;// 双指针:i 为当前段起点,j 向后扩张直到字符改变while(i<n){intj=i;while(j<n&&s.charAt(j)==s.charAt(i)){j++;}intcnt=j-i;// 计数 >1 才写数字,单个字符只写字母if(cnt>1){res.append(s.charAt(i)).append(cnt);}else{res.append(s.charAt(i));}i=j;// 跳到下一段起点}returnres.toString();}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Strings=sc.nextLine();System.out.println(compress(s));}}

Python

defcompress(s:str)->str:n=len(s)ifn==0:return""res=[]i=0# 双指针:i 为当前段起点,j 向后扩张直到字符改变whilei<n:j=iwhilej<nands[j]==s[i]:j+=1cnt=j-i# 计数 >1 才写数字,单个字符只写字母ifcnt>1:res.append(f"{s[i]}{cnt}")else:res.append(s[i])i=j# 跳到下一段起点return"".join(res)if__name__=="__main__":importsys s=sys.stdin.read().strip()print(compress(s))

JavaScript

// 使用 readline 读取输入constreadline=require('readline');functioncompress(s){constn=s.length;if(n===0)return"";letres="";leti=0;// 双指针:i 为当前段起点,j 向后扩张直到字符改变while(i<n){letj=i;while(j<n&&s[j]===s[i]){j++;}constcnt=j-i;// 计数 >1 才写数字,单个字符只写字母if(cnt>1){res+=s[i]+cnt;}else{res+=s[i];}i=j;// 跳到下一段起点}returnres;}constrl=readline.createInterface({input:process.stdin});letinput="";rl.on('line',line=>{input+=line;});rl.on('close',()=>{console.log(compress(input));});

C++

#include<iostream>#include<string>usingnamespacestd;stringcompress(string s){intn=s.length();if(n==0)return"";string res="";inti=0;// 双指针:i 为当前段起点,j 向后扩张直到字符改变while(i<n){intj=i;while(j<n&&s[j]==s[i]){j++;}intcnt=j-i;// 计数 >1 才写数字,单个字符只写字母if(cnt>1){res+=s[i]+to_string(cnt);}else{res+=s[i];}i=j;// 跳到下一段起点}returnres;}intmain(){string s;cin>>s;cout<<compress(s);return0;}

Go

packagemainimport("bufio""fmt""os""strconv""strings")// compress 双指针扫描字符串进行压缩编码funccompress(sstring)string{n:=len(s)ifn==0{return""}varres strings.Builder i:=0// 双指针:i 为当前段起点,j 向后扩张直到字符改变fori<n{j:=iforj<n&&s[j]==s[i]{j++}cnt:=j-i// 计数 >1 才写数字,单个字符只写字母ifcnt>1{res.WriteByte(s[i])res.WriteString(strconv.Itoa(cnt))}else{res.WriteByte(s[i])}i=j// 跳到下一段起点}returnres.String()}funcmain(){reader:=bufio.NewReader(os.Stdin)s,_:=reader.ReadString('\n')s=strings.TrimRight(s,"\r\n")fmt.Println(compress(s))}

C语言

#include<stdio.h>#include<string.h>// compress 双指针扫描字符串进行压缩编码voidcompress(constchar*s,char*res){intn=strlen(s);if(n==0){res[0]='\0';return;}intidx=0;// res 的写入位置inti=0;// 双指针:i 为当前段起点,j 向后扩张直到字符改变while(i<n){intj=i;while(j<n&&s[j]==s[i]){j++;}intcnt=j-i;// 计数 >1 才写数字,单个字符只写字母if(cnt>1){res[idx++]=s[i];// 将数字转换为字符串charbuf[12];sprintf(buf,"%d",cnt);for(intk=0;buf[k]!='\0';k++){res[idx++]=buf[k];}}else{res[idx++]=s[i];}i=j;// 跳到下一段起点}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
  • 解题思路
    • 核心思想
    • 算法步骤
    • 复杂度分析
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

http://www.jsqmd.com/news/1189938/

相关文章:

  • 【轴承齿轮振动噪声特性研究无标题】
  • Luma视频生成API成本优化与对接实践
  • FastAPI+Streamlit构建营销文案AI工作流
  • 2026 年新消息:上海正规的纹眉培训店哪家靠谱,揭秘纹眉行业:普通人如何靠它逆袭? - 行业推荐官【认证】
  • 所有缺钱的人,2026年都去挖漏洞,抓住最后的机会!
  • TI LP2985-N LDO深度解析:新旧版本对比、低噪声电源设计与实战指南
  • ChatGPT模拟对话练习到底练什么?MIT人机交互实验室2023白皮书揭示:3类隐性能力决定87%训练成效
  • 卡尔曼滤波实战:从阿波罗登月到嵌入式传感器融合
  • 纯Python零API抓取推文:Twint实战与业务洞察生成
  • 【一线大厂Java面试题合集】第75篇-分布式存储与搜索系统
  • 一文讲透 Agent 演进的四大底层模式:Sub-Agent、Skills、Handoffs 与 Router
  • 2026东莞酸碱类危化品经营许可证代办机构测评排行:属地合规办理指南 - 广州品润财税服务
  • 南京名表名包“挑瑕压价”套路深!鼓楼这家店当面鉴定不临时压价 - GrowUME
  • AI智能体开发供应商推荐:揭秘新势力供应商优劣势对比
  • D3KeyHelper暗黑3按键助手:终极免费自动化游戏工具完全指南
  • DWM内存泄漏溯源与根治:从驱动更新到系统级优化
  • 2026 年当下,解放评价高的石头加工优质厂家深度解析与优选指南,别再盲目开采!揭秘石头加工背后的高利润秘密 - 行业推荐【认证官】
  • DeepSeek峰谷定价下AI应用成本优化:Codex工具链实战指南
  • 从反应视频到技术实践:视频处理与数据分析应用指南
  • 【1000个Linux内存知识-005】-从mem_map到物理地址:PFN如何成为Linux内存寻址的通用货币?
  • ExifToolGUI:5分钟掌握专业级图像元数据批量处理,告别繁琐手动操作
  • 音频生成与处理技术:从深度学习到工程部署实践
  • 2026 年现阶段,柯城有实力的水库丢失项链打捞企业怎么联系,深潜员下水后没捞到项链,却发现了更骇人的真相 - 行业推荐【认证官】
  • UE5集成FSR 2.2全攻略:从原理到实战的性能优化指南
  • 2026年深圳龙岗短视频策划拍摄代运营一站式服务商推荐:深圳昊客网络以三段式一体化生产线跑赢分环节外包 - 一风AI推广
  • 2026佛山浴室柜源头厂家推荐|家装定制、楼盘工程卫浴柜一站式生产 - GrowUME
  • YL1621H芯片口碑怎么样?硬件工程师实测反馈全解析
  • 欧几里得证明入门:用古典几何训练逻辑思维
  • Scratch AI视觉分类实战:从摄像头采集到模型集成的完整指南
  • 系统清理优化工具:从原理到实践,解决Windows系统熵增问题