首页 > 其他分享 >华为OD机试真题---字母组合

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

时间:2024-11-06 15:45:00浏览次数:4  
标签:map 数字 组合 真题 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机试中的“字母组合”题目。

标签:map,数字,组合,真题,OD,字符串,屏蔽,字母组合
From: https://blog.csdn.net/lbp0123456/article/details/143478758

相关文章

  • Mac系统安装node.js及环境配置
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18530322➤如果链接不是为敢技术的博客园地址,则可能......
  • ModelMaker 7由pas逆向类图
    下载通过百度网盘分享的文件:ModelMaker_v7.20.rar链接:https://pan.baidu.com/s/1-jc39uRv5X96HqrkeDs5ZA提取码:i9pb逆向工程逆向工程在MM中十分简单。但是要提醒,先备份一下你的旧代码。1.【单元视图】(Units)选“ImportUnit..”2.选择你要导入的.pas文件。3.ok后你在【......
  • leetcode11.盛最多水的容器
    标签:贪心;双指针问题:给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。【height.length >=2】思路:最后......
  • 银行业专业人员职业资格考试《公司信贷(中级)》机考真题精选及详解
    2022年银行业专业人员职业资格考试《公司信贷(中级)》机考真题精选及详解​1.[单选题]下列选项中,不属于保证担保的主要风险因素的是()。A.未办理相关登记手续B.保证手续不完备C.公司互保D.虚假担保人答案:A解析:保证担保的主要风险包括:①保证人不具备担保资格;②保证人不具备担......
  • 在K8S中,Pod创建失败如何解决?
    在Kubernetes(K8s)中,Pod创建失败是一个常见的问题,可能由多种原因引起。为了解决这个问题,需要按照一定的步骤进行排查和修复。以下是一个详细的解决流程:1.确认集群状态首先,需要确认Kubernetes集群本身是否正常运行。可以通过以下命令来检查集群中的节点状态:kubectlgetnodes......
  • 150道MySQL高频面试题,学完吊打面试官--InnoDB索引与MyISAM索引实现的区别+一个表中如
    前言本专栏为150道MySQL大厂高频面试题讲解分析,这些面试题都是通过MySQL8.0官方文档和阿里巴巴官方手册还有一些大厂面试官提供的资料。MySQL应用广泛,在多个开发语言中都处于重要地位,所以最好都要掌握MySQL的精华面试题,这也是面试官最喜欢问的,现在面试官在面试的时候更关......
  • Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)
      ......
  • 双token无感刷新nodejs+vue3(保姆级教程)
    什么是双Token无感刷新?双Token无感刷新机制使用两个不同的token来管理用户的身份验证和会话。通常情况下,这两个token是:访问Token(AccessToken):用于访问受保护的资源,通常具有较短的有效期(如15分钟到1小时)。当用户进行API请求时,附带此token以证明其身份。刷......
  • Node.js-增强 API 安全性和性能优化
    ​......
  • node.js毕设中国传统文化服饰交流平台(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于中国传统文化服饰交流平台的研究,现有研究主要集中在传统文化服饰的历史、艺术价值等方面,如在传统服饰的审美意蕴研究中,多是从单一的美学角度探讨其......