华为OD机试真题---字母组合

华为OD机试中的“字母组合”题目是一道涉及字符串处理和回溯算法的编程题。以下是对该题目的详细解析:

一、题目描述

每个数字关联多个字母,关联关系如下:

  • 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”

输入一串数字后,通过数字和字母的对应关系可以得到多个字母字符串(要求按照数字的顺序组合字母字符串)。同时,给定一个屏蔽字符串,屏蔽字符串中的所有字母不能同时在输出的字符串出现。例如,屏蔽字符串是“abc”,则要求字符串中不能同时出现a、b、c,但是允许同时出现a、b或a、c或b、c等。

二、输入描述

  • 第一行输入为一串数字字符串,数字字符串中的数字不允许重复,数字字符串的长度大于0,小于等于5。
  • 第二行输入是屏蔽字符串,屏蔽字符串的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复。

三、输出描述

输出可能的字符串组合,字符串之间使用逗号隔开,最后一个字符串后携带逗号。

四、解题思路

  1. 使用Map数据结构存储数字与字母的对应关系。
  2. 使用回溯算法遍历所有可能的字母组合。
  3. 在遍历过程中,检查当前组合是否包含屏蔽字符串中的所有字符,如果是,则跳过该组合。
  4. 将符合条件的组合添加到结果列表中。
  5. 最后,将结果列表转换为字符串并输出。

五、参考代码

以下是一个可能的Java实现:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;public class monogram {/*** 主函数,用于处理输入的字符串并输出特定组合的字符串*/public static void main(String[] args) {// 创建Scanner对象以读取输入Scanner in = new Scanner(System.in);// 初始化一个映射,用于将数字字符串映射到对应的字母字符串Map<String, String> map = new HashMap<>();map.put("0", "abc");map.put("1", "def");map.put("2", "ghi");map.put("3", "jkl");map.put("4", "mno");map.put("5", "pqr");map.put("6", "st");map.put("7", "uv");map.put("8", "wx");map.put("9", "yz");// 循环读取输入的字符串并处理while (in.hasNext()) {// 读取第一个字符串,用于生成所有可能的字母组合String str = in.next();// 读取第二个字符串,用于过滤生成的组合String gxStr = in.next();// 将第一个字符串拆分成单个字符String[] strings = str.split("");// 初始化一个列表,用于存储所有可能的字母组合List<String> path = new ArrayList<>();// 调用深度优先搜索函数生成所有可能的字母组合dfs(map, strings, 0, new StringBuilder(), path);// 初始化一个StringBuilder对象,用于构建最终的输出字符串StringBuilder stringBuilder = new StringBuilder();// 遍历所有可能的字母组合,过滤掉包含gxStr的组合for (String pa : path) {if (!pa.contains(gxStr)) {stringBuilder.append(pa).append(" ");}}// 输出处理后的字符串System.out.println(stringBuilder.toString().trim());}}/*** 使用深度优先搜索(DFS)生成所有可能的字符串组合* 此方法主要用于在给定的映射和字符串数组基础上,生成所有可能的字符串路径** @param map 包含字符串映射的字典,用于查找每个字符串可能的下一个字符* @param strings 字符串数组,表示需要处理的字符串序列* @param startIndex 当前处理的起始索引,用于指示当前在处理数组中的哪个元素* @param sb StringBuilder对象,用于构建当前路径中的字符串* @param path 保存所有可能字符串路径的列表*/public static void dfs(Map<String, String> map, String[] strings, int startIndex, StringBuilder sb, List<String> path) {// 当起始索引达到字符串数组长度时,表示已构建完成一个可能的字符串路径,将其添加到路径列表中if (startIndex == strings.length) {path.add(sb.toString());return;}// 获取当前字符串可能的下一个字符映射值String mapValues = map.get(strings[startIndex]);// 遍历当前字符串可能的下一个字符for (int i = 0; i < mapValues.length(); i++) {// 将当前字符添加到StringBuilder中sb.append(mapValues.charAt(i));// 递归调用dfs方法,处理下一个字符串dfs(map, strings, startIndex + 1, sb, path);// 回溯,删除StringBuilder中最后一个字符,以尝试下一个可能的字符sb.deleteCharAt(sb.length() - 1);}}
}

六、运行示例

输入

23
ad

输出

gj gk gl hj hk hl ij ik il
解析
  1. 输入解析

    • 第一行输入为数字字符串 “23”,表示我们需要根据数字 2 和 3 来生成字母组合。
    • 第二行输入为屏蔽字符串 “ad”,表示生成的字母组合中不能同时包含字符 ‘a’ 和 ‘d’。
  2. 数字与字母的对应关系

    • 根据题目给出的对应关系,数字 2 对应字母 “ghi”,数字 3 对应字母 “jkl”。
  3. 回溯过程

    • 从数字 2 开始,我们可以选择 ‘g’、‘h’ 或 ‘i’ 作为第一个字符。
    • 然后,从数字 3 开始,我们可以选择 ‘j’、‘k’ 或 ‘l’ 作为第二个字符。
    • 通过回溯算法,我们可以生成所有可能的组合:gi, gj, gk, hi, hj, hk, ii, ij, ik, …(但注意,这里我列出的组合中包含了重复和不符合题目要求的组合,实际代码中会通过检查来排除它们)。
  4. 屏蔽字符串检查

    • 在生成每个组合后,我们需要检查该组合是否包含屏蔽字符串 “ad” 中的所有字符。但在这个例子中,屏蔽字符串只包含两个字符,且它们不会同时出现在任何有效的组合中(因为 ‘a’ 不在 “ghi” 或 “jkl” 中,‘d’ 也不在这些字母中)。所以,实际上这个屏蔽字符串在这个特定例子中不会排除任何组合。但为了通用性,代码中仍然包含了这个检查。
  5. 输出处理

    • 在这个例子中,由于屏蔽字符串不会排除任何组合,所以所有可能的组合都会被输出。
    • 输出格式为逗号分隔的字符串,且最后一个字符串后也带有逗号(这是题目要求的格式)。
  6. 注意

    • 在实际代码中,我注意到一个潜在的问题:当数字字符串包含 “6” 或 “7” 时,由于它们对应的字母较少(如 “st” 和 “uv”),在回溯过程中可能会生成不符合题目要求的组合(即包含重复数字对应的字母,但在这个特定示例中不会出现这种情况)。然而,由于题目要求数字字符串中的数字不允许重复,且每个数字对应的字母集合也是固定的,所以这个问题在这个特定题目中不会造成实际影响。
    • 另外,我之前的回答中提到的代码在处理输入时使用了 Scannernext() 方法,这可能会导致在读取多行输入时出现问题(如果输入不是通过标准输入流提供的)。在实际应用中,可能需要根据具体的输入方式来调整代码。

七、注意事项

  1. 在处理输入时,要注意数字字符串和屏蔽字符串的格式和长度要求。
  2. 在回溯过程中,要正确维护当前组合的状态,并在遍历完所有可能后将其添加到结果列表中。
  3. 在输出结果时,要注意字符串之间的逗号和最后一个字符串后的逗号。

通过以上步骤,你可以成功地解决华为OD机试中的“字母组合”题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463621.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

气膜冰雪项目:推动冰雪运动发展的新纪元—轻空间

随着2024年北京冬奥会的余温仍在延续&#xff0c;气膜冰雪项目在我国的冰雪运动发展中扮演着愈发重要的角色。气膜结构以其独特的优势&#xff0c;正吸引着越来越多的参与者&#xff0c;推动着冰雪运动的普及与发展。 突出的优势 气膜冰雪馆的设计理念充分体现了现代建筑的灵活…

市场分化!汽车零部件「变天」

全球汽车市场的动荡不安&#xff0c;还在持续。 本周&#xff0c;全球TOP20汽车零部件公司—安波福&#xff08;Aptiv&#xff09;发布2024年第三季度财报显示&#xff0c;三季度公司经调整后确认收入同比下降6%&#xff1b;按照区域市场来看&#xff0c;也几乎是清一色的下滑景…

ES6中数组新增了哪些扩展?

ES6中数组新增了哪些扩展&#xff1f; 1、扩展运算符的应⽤ ES6通过扩展元素符 … &#xff0c;好⽐ rest 参数的逆运算&#xff0c;将⼀个数组转为⽤逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 [...documen…

基于物联网的户外环境检测装置教学文章

引言 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;越来越多的应用被广泛研究和应用于我们的日常生活中。户外环境检测装置是一种利用传感器、网络连接和数据分析技术&#xff0c;监测和分析环境数据&#xff08;如温度、湿度、空气质量等&#xff09;的设备。…

ubuntu20安装opencv3.2记录

系统环境 ubuntu20安装了ros-noetic&#xff0c;所以系统默认装了opencv4.2.0&#xff0c;但是跑fastlivo推荐的是opencv3.2.0&#xff0c;而且海康相机别人写的ros驱动&#xff08;海康相机ros驱动&#xff09;也是需要opencv3.2.0&#xff0c;最终还是选择安装多版本的openc…

全!新!LLM推理加速调研

本文主要内容 介绍一篇大模型推理加速综述论文&#xff0c;简单说明了LLM推理加速的基本内容。 介绍了推理阶段的prefilling&#xff08;主要方向&#xff1a;计算优化&#xff09;和decoding&#xff08;主要方向&#xff1a;内存优化&#xff09;差异。 prefilling优化方面…

大数据-206 数据挖掘 机器学习理论 - 多元线性回归 回归算法实现 算法评估指标

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Python+Appium+Pytest+Allure自动化测试框架-安装篇

文章目录 安装安装ADT安装NodeJs安装python安装appium安装Appium Server&#xff08;可选&#xff09;安装Appium-Inspector&#xff08;可选&#xff09;安装allure安装pytest PythonAppiumPytestAllure框架的安装 Appium是一个开源工具&#xff0c;是跨平台的&#xff0c;用于…

Nature Methods | 新型三维光场显微成像技术

欢迎关注GZH《光场视觉》 近日&#xff0c;中科院脑科学与智能技术卓越创新中心王凯研究组在《自然方法》&#xff08;Nature Methods&#xff09;上&#xff0c;在线发表了题为Volumetric Voltage Imaging of Neuronal Populations in Mouse Brain by Confocal Light Field M…

深度学习基础—循环神经网络的梯度消失与解决

引言 深度学习基础—循环神经网络&#xff08;RNN&#xff09;https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshareblogdetail&sharetypeblogdetail&sharerId143417972&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link深…

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如&#xff0c;二维空间中的向量可以表示为 (&#x1d465;,&#x1d466;) &#xff0c;表示从原点 (0,0)到点 (&#x1d465;,&#x1d466;)的有向线段。 1.1、文本向量 1…

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成&#xff0c;软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;打开软件&#xff0c;根据自己…

国产操作系统重新安装软件商店

国产操作系统类似于手机的“应用商店”&#xff0c;都会有一个“软件商店”&#xff0c;方便用户安装管理电脑的软件。这个软件商店不仅有各种软件&#xff0c;还有各类外设驱动和移动应用环境模拟功能。软件商店可以下载安装软件&#xff0c;还可以更新、卸载软件。 软件商店 …

FastAPI中如果async def和def 路由的区别

在python的整体生态中&#xff0c;虽然已经有很多库支持了异步调用&#xff0c;如可以使用httpx或者aiohttp代替requests库发起http请求&#xff0c;使用asyncio.sleep 代替time.sleep&#xff0c; 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库&#xff0c…

Pinctrl子系统中Pincontroller和client驱动程序的编写

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【C++动态规划】2435. 矩阵中和能被 K 整除的路径|1951

本文涉及知识点 C动态规划 LeetCode2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发&#xff0c;每一步只能往 下 或者往 右 &#xff0c;你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的…

【QT】Qt对话框

个人主页~ Qt窗口属性~ Qt窗口 五、对话框2、Qt内置对话框&#xff08;1&#xff09;Message Box&#xff08;2&#xff09;QColorDialog&#xff08;3&#xff09;QFileDialog&#xff08;4&#xff09;QFontDialog&#xff08;5&#xff09;QInputDialog 五、对话框 2、Qt内…

视频推荐的算法(字节青训)

题目&#xff1a; 西瓜视频 正在开发一个新功能&#xff0c;旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序&#xff0c;计算给定数据中的80百分位数。 例如&#xff1a;假设有一个包含从1到100的整数数组&#xff0c;80百分位数的值为80&#…

线程基础知识、jmm(Java内存模型)

目录 线程基础知识 并发与并行 进程和线程 线程优先级 创建线程的方式主要有三种 休眠 作出让步 join() 方法 线程协作注意什么 理解线程状态 选择合适的协作工具 共享资源的访问控制 避免竞争条件 创建线程几种方式 线程状态&#xff0c;状态之间切换 新建&…

2.数组越界访问如何调试HardFault错误

数组越界 在项目开发过程中&#xff0c;配置串口外设是一个常见的任务&#xff0c;但在实际操作中&#xff0c;我们可能会遇到一些预料之外的问题。例如&#xff0c;在调试过程中&#xff0c;我们发现单片机只接受了一次数据后便不再接收&#xff0c;这无疑是一个棘手的问题。…