华为OD机试真题——字母组合过滤组合字符串(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

article/2025/8/18 17:37:38

在这里插入图片描述

2025 A卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《字母组合过滤组合字符串》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:字母组合过滤组合字符串


知识点:字符串、回溯算法、逻辑处理
时间限制:1秒
空间限制:256MB
限定语言:不限


题目描述

数字0-9分别关联a~z的26个英文字母,具体对应关系如下:

  • 0 → “a”,“b”,“c”
  • 1 → “d”,“e”,“f”
  • 2 → “g”,“h”,“i”
  • 3 → “j”,“k”,“l”
  • 4 → “m”,“n”,“o”
  • 5 → “p”,“q”,“r”
  • 6 → “s”,“t”
  • 7 → “u”,“v”
  • 8 → “w”,“x”
  • 9 → “y”,“z”

输入要求

  1. 第一行为一串不重复的数字字符串,长度范围1-5。
  2. 第二行为屏蔽字符串,其长度小于数字字符串长度,且字符不重复。

输出要求

  • 根据数字顺序生成所有可能的字母组合字符串。
  • 若组合字符串完全包含屏蔽字符串的所有字符(即屏蔽字符串的每个字符均出现在组合中),则剔除该组合。
  • 输出剩余的组合字符串,用逗号分隔,末尾带逗号。

示例1
输入:

78  
ux  

输出:

uw,vw,vx,  

说明:数字"7"对应"u",“v”,“8"对应"w”,“x”,生成组合为[“uw”,“ux”,“vw”,“vx”]。其中"ux"完全包含屏蔽字符串"ux",故剔除。

示例2
输入:

23  
jl  

输出:

jk,jl,kl,  

说明:数字"2"对应"g",“h”,“i”,“3"对应"j”,“k”,“l”,生成组合中"jl"包含屏蔽字符串"jl",需剔除。


Java

问题分析

题目要求根据数字到字母的映射生成所有可能的组合字符串,并过滤掉包含屏蔽字符串所有字符的组合。需要处理以下问题:

  1. 数字到字母的映射:每个数字对应一组字母。
  2. 生成所有组合:通过回溯算法生成所有可能的字母组合。
  3. 过滤条件:剔除完全包含屏蔽字符串所有字符的组合。

解题思路

  1. 映射表构建:预定义数字到字母的映射关系。
  2. 回溯生成组合:递归生成所有可能的字母组合。
  3. 过滤与输出:检查每个组合是否包含屏蔽字符串的所有字符,剔除符合条件的组合后排序输出。

代码实现

import java.util.*;public class Main {private static final String[] MAPPING = {"abc", "def", "ghi", "jkl", "mno", "pqr", "st", "uv", "wx", "yz"};public static void main(String[] args) {Scanner sc = new Scanner(System.in);String digits = sc.nextLine().trim();String block = sc.nextLine().trim();List<String> combinations = new ArrayList<>();if (!digits.isEmpty()) {backtrack(combinations, digits, new StringBuilder(), 0);}Set<Character> blockSet = new HashSet<>();for (char c : block.toCharArray()) {blockSet.add(c);}List<String> filtered = new ArrayList<>();for (String s : combinations) {if (!containsAll(s, blockSet)) {filtered.add(s);}}Collections.sort(filtered);StringBuilder sb = new StringBuilder();for (String s : filtered) {sb.append(s).append(',');}System.out.println(sb.toString());}private static void backtrack(List<String> result, String digits, StringBuilder current, int index) {if (index == digits.length()) {result.add(current.toString());return;}int digit = digits.charAt(index) - '0';String letters = MAPPING[digit];for (char c : letters.toCharArray()) {current.append(c);backtrack(result, digits, current, index + 1);current.deleteCharAt(current.length() - 1);}}private static boolean containsAll(String s, Set<Character> blockSet) {for (char c : blockSet) {if (s.indexOf(c) == -1) {return false;}}return true;}
}

代码详解

  1. 映射表定义

    private static final String[] MAPPING = { ... };
    
    • 使用数组 MAPPING 存储数字到字母的映射,索引对应数字,值为字母字符串。
  2. 输入处理

    String digits = sc.nextLine().trim();
    String block = sc.nextLine().trim();
    
    • 读取输入的数字字符串和屏蔽字符串。
  3. 回溯生成组合

    backtrack(combinations, digits, new StringBuilder(), 0);
    
    • 调用 backtrack 方法生成所有可能的组合。
    • 递归终止条件:当 index 等于数字字符串长度时,将当前组合加入结果列表。
    • 遍历字母:对当前数字对应的每个字母,递归生成后续组合。
  4. 过滤条件检查

    private static boolean containsAll(String s, Set<Character> blockSet) {for (char c : blockSet) {if (s.indexOf(c) == -1) {return false;}}return true;
    }
    
    • 检查组合字符串 s 是否包含屏蔽字符串的所有字符。
  5. 结果处理与输出

    Collections.sort(filtered);
    StringBuilder sb = new StringBuilder();
    for (String s : filtered) {sb.append(s).append(',');
    }
    System.out.println(sb.toString());
    
    • 对过滤后的结果排序,并按逗号分隔输出。

示例测试

  1. 示例1输入

    78  
    ux  
    

    输出

    uw,vw,vx,  
    

    说明:组合 “ux” 包含所有屏蔽字符,被过滤。

  2. 示例2输入

    23  
    jl  
    

    输出

    jk,jl,kl,  
    

    说明:组合 “jl” 包含所有屏蔽字符,被过滤。

  3. 测试用例
    输入

    5  
    pq  
    

    输出

    p,q,r,  
    

    说明:屏蔽字符串 “pq” 未被任何组合包含,所有组合保留。


综合分析

  1. 时间复杂度

    • 生成组合:O(3^N),每个数字最多对应3个字母,N为数字字符串长度。
    • 过滤与排序:O(M log M),M为生成组合的数量。
  2. 空间复杂度

    • O(3^N),存储所有组合字符串。
  3. 正确性

    • 通过回溯遍历所有可能的组合,确保生成完整的解空间。
    • 严格检查每个组合是否包含屏蔽字符串的所有字符。
  4. 适用性

    • 适用于数字字符串长度1~5的情况,符合题目限制。
  5. 优化点

    • 剪枝策略:在生成组合的过程中可提前判断是否可能包含屏蔽字符,减少无效递归。
    • 空间优化:直接生成过滤后的结果,减少存储开销。

python

问题分析

题目要求根据数字到字母的映射生成所有可能的组合字符串,并过滤掉完全包含屏蔽字符串所有字符的组合。需要解决以下问题:

  1. 数字到字母的映射:每个数字对应一组字母。
  2. 生成所有组合:通过回溯算法生成所有可能的字母组合。
  3. 过滤条件:剔除包含屏蔽字符串所有字符的组合。

解题思路

  1. 映射表构建

http://www.hkcw.cn/article/icHgCRwrkA.shtml

相关文章

男子深夜爬泰山崩溃痛哭:大喊要回家找媳妇

男子深夜爬泰山崩溃痛哭。全网疯传!夜爬泰山避坑指南:为何有人登顶后痛哭?这些细节能救命!泰山景区数据显示,夜爬游客受伤率同比激增,其中78%因未携带照明设备跌落台阶。最近曝光的"大学生夜爬冻伤事件",正是轻视了泰山顶与山脚高达15℃的温差。正值暑期夜爬高…

网友在摩洛哥偶遇成都“洋中医”狂飙四川话

网友在摩洛哥偶遇成都“洋中医”。首位外籍中医博士迪亚拉在摩洛哥被偶遇与成都“老乡”狂飙四川话5月26日,有网友发布视频称在摩洛哥偶遇首位外籍中医博士迪亚拉,两人狂飙四川话,还约在成都吃火锅。迪亚拉,1984年获奖学金到中国学习,于1997年获得成都中医药大学博士学位,…

端午假期首都博物馆延长开放时间 六月活动精彩纷呈

端午假期首都博物馆延长开放时间!为了满足广大观众的参观需求,首都博物馆2025年6月将进行部分场次的延时开放活动。端午假期及6月份延时开放相关事宜如下:2025年5月31日(端午节、周六)至6月2日(周一)正常开放。延时开放场次为5月31日(端午节、周六)、6月7日(周六)、…

老人骑电动车捎人遇车祸后被判赔14万 好心搭载惹争议

老人骑电动车捎人遇车祸后被判赔14万 好心搭载惹争议!2023年8月15日清晨,浙江省东阳市六石街道徐庄村的卢某芳老人骑电动车前往镇上参加领鸡蛋的促销活动。在现场,她遇到了隔壁村的老友吕某,在返程时捎带吕某一同回家,尽管这需要绕路。不幸的是,在返程途中,电动车与一辆…

辣目洋子回母校重大讲座分享 勇敢追梦不惧质疑

5月29日,李嘉琦回到母校重庆大学,参加新闻学院“优秀校友回母校”系列讲座。她以“梦想?梦幻?人生也是一部电视剧”为主题,与学弟学妹们分享了自己在母校时的学习生活和进入娱乐圈的经历。李嘉琦从小有一个当演员的梦想,但不知道如何实现。高考时,她从内蒙古考入重庆大学…

济南5元快餐店老板回应是否亏钱 意外走红后生意更旺

山东济南市天桥区一家名为“小孟5元自助快餐”的小店,因一条关于“菜量少并且贵”的差评意外走红网络。许多网友在该店外卖及美食点评平台的评论区跟帖“玩梗”,晒出波龙、帝王蟹等海鲜美食图片,替店老板发声鸣不平。这家备受热捧的小店位于巷子里,面积约10平方米。厨房和打…

数据库 | timescaledb性能初步测试

数据库docker限制资源&#xff1a;CPU 4核&#xff0c;内存 8G。数据库版本&#xff1a;2.15.1-pg16 表结构和索引如下&#xff1a; CREATE TABLE dm_tag_value (id BIGINT NOT NULL DEFAULT 0,ds_id BIGINT DEFAULT NULL,tag_name VARCHAR(200) DEFAULT NULL,tag_value VARCH…

CVE-2019-0193源码分析与漏洞复现

漏洞概述 漏洞名称&#xff1a;Apache Solr DataImportHandler 远程代码执行漏洞 漏洞编号&#xff1a;CVE-2019-0193 CVSS 评分&#xff1a;9.8 影响版本&#xff1a;Apache Solr 1.3 - 8.2.0 修复版本&#xff1a;Apache Solr ≥ 8.2.0 漏洞类型&#xff1a;输入验证缺陷导致…

圣杯布局和双飞翼布局的实现方法

目录 一、圣杯布局 1.传统布局floatmargin 2.使用flex布局 3.使用grid网格布局 二、双飞翼布局 一、圣杯布局 1.传统布局floatmargin 使用传统的float浮动和相对定位来实现 <div class"main-container"><div class"main"></div><div …

第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】

引言 Odoo 是一款强大的开源企业资源规划&#xff08;ERP&#xff09;与客户关系管理&#xff08;CRM&#xff09;系统&#xff0c;其核心竞争力之一在于高度模块化的架构设计。模块系统不仅是 Odoo 框架的基石&#xff0c;更是实现功能灵活扩展与定制的关键。本文将结合 Odoo…

一台笔记本实现基因表达敲除?!scTenifoldKnk 单细胞基因模拟敲除教程

生信碱移 单细胞基因模拟敲除 scTenifoldKnk 是一种基于单细胞RNA测序数据进行虚拟基因敲除分析的方法&#xff0c;能够用于预测特定基因在某一细胞群体中敲低后的整体基因表达谱变化&#xff0c;也可以扩展到多细胞群体的敲除分析。 基因扰动实验是研究特定基因功能作用的强大…

高架疑车道减少致车辆高坠人员伤亡 死者家属称正商量赔偿

据澎湃新闻报道,有网友反映,5月19日,其侄儿驾车经过广东东莞环莞快速路虎门段,由于四车道变三车道,车辆从高架冲出路面后高坠,车内人员出现伤亡。5月29日,极目新闻记者致电东莞市应急管理局询问事故处置情况,接线人员表示,公安机关在负责处理此事。虎门交警工作人员也…

76岁男子长期吸烟被确诊为肺癌晚期 放射性粒子植入治疗成功实施

5月29日,上海交通大学医学院附属第九人民医院呼吸与危重症医学科戈霞晖主任医师团队成功为一名76岁的小细胞肺癌晚期患者实施了放射性碘125粒子植入治疗,实现了肿瘤的“定点爆破”。这种植入术能够持续释放低剂量γ射线,最大程度破坏肿瘤组织,并有效保护周围正常组织。这名…

成都27岁女子在家门口被害 凶手父亲抱怨因此事有家难回

女儿被杀已属最大不幸,还要承受凶手父亲的抱怨,这让人情何以堪?成都27岁女子王某雅在家门口被杀,凶手的父亲竟称:“就这事害我们有家不能回,花钱在外面住宾馆。”被害的王某雅,海归硕士,喜欢跳舞,平时在家线上办公。她是人们口中“别人家的孩子”,是母亲王女士的骄傲…

1.什么是node.js、npm、vue

一、Node.js 是什么&#xff1f; &#x1f63a; 定义&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;让你可以在浏览器之外运行 JavaScript 代码&#xff0c;主要用于服务端开发。 &#x1f63a;从计算机底层说&#xff1a;什么是“运…

续肉不停!广东潮汕菜市场的猪脚饭要蹲着吃

广东潮汕菜市场的猪脚饭要蹲着吃,在广东潮汕地区,猪脚分为两大门派,一派是隆江,一派为东里,与隆江猪脚一整只卤制不同,东里猪脚要对半分开,切断骨头,是为了让骨髓融入卤汁,令猪脚更易入味。经过炖煮的猪脚和肉,吸足了卤汁,皮胶肉烂,油光水滑,酥香软糯得入口即化,…

库存翻番,赠送股东!五芳斋粽子,卖不动了?BUG:股东申领热情高

五芳斋近日宣布向股东赠送粽子礼盒,引发广泛关注。根据公告,截至4月28日交易结束,在中国证券登记结算有限责任公司上海分公司登记在册的持有公司股份1000股(含)以上的股东,每位可以申领“丰年五芳”粽子礼盒一盒,申领时间为2025年5月28日至6月8日。然而,市场对此反应冷…

男子杀害摊主潜逃27年落网 乡音暴露身份密码

27年前,21岁的外省小伙阿亮在当地与一猪肉摊摊主发生口角,一时冲动持刀将其杀害后隐姓埋名潜逃。当时的技术条件有限,警方追凶工作一度陷入瓶颈。27年后,阿亮辗转逃至扬州仪征。仪征警方凭借一句乡音破解了他的“身份密码”,成功将其抓获归案,这起尘封多年的命案积案终于…

郑大一附院世界最大的医院原院长阚全程被查

“宇宙第一大医院”郑大一附院原院长阚全程被查,医疗圈人称其“阚十亿”。责任编辑:zx0002

为什么现在的富二代更卷?

提到「富二代」,很多人都觉得他们是只知道吃喝玩乐的纨绔子弟,但是很多时候,有些富二代并不像我们想象当中的无忧无虑,现在另一种「卷王富二代」变得越来越多。富二代和穷二代,差的不仅仅是「富」和「穷」,而是平台、资源、心态等等很多方面的差距,之前网上比较流行的一…