如何在华为OD机试中获得满分?Java实现【字母组合】一文详解

news2024/12/24 4:45:53

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)

文章目录

  • 1. 题目描述
    • 2. 输入描述
    • 3. 输出描述
    • 4. Java算法源码
    • 5. 测试
    • 6.解题思路

1. 题目描述

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

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等;

给定一个数字字符串和一个屏蔽字符串,输出所有可能的字符组合;

例如:

输入数字字符串78和屏蔽字符串ux,输出结果为uw,vw,vx;

数字字符串78,可以得到如下字符串: uw,ux,vw,vx;由于ux是屏蔽字符串,因此排除ux,最终的输出时uw,vw,vx;

2. 输入描述

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

3. 输出描述

输出可能的字符串组合。

注:字符串之间使用逗号隔开,最后一个字符串后携带逗号

4. Java算法源码

/**
 * 78
 * ux
 */
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    // 数字字符串
    String numbers = in.nextLine();
    // 屏蔽字符串
    String noStr = in.nextLine();

    List<String> list = new ArrayList<String>();
    // 数字对应的字母组合
    String[] arr = new String[numbers.length()];
    for (int i = 0; i < numbers.length(); i++) {
        // 单个数字
        int number = Integer.valueOf(numbers.charAt(i)+"");
        // 数字对应的字母组合
        arr[i] = hashMap.get(number);
    }

    int index = 0;
    LinkedList<Character> charLine = new LinkedList<>();
    solution(arr, index, list, charLine, noStr);
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i) + ",");
    }
}

/**
 *
 * @param arr 数字对应的字母组合
 * @param index 第几个字母
 * @param list 不包含屏蔽字符串的字符串集合
 * @param charLine 合格的字母集合
 * @param noStr 屏蔽字符串
 */
public static void solution(String[] arr, int index, List<String> list, LinkedList<Character> charLine, String noStr) {
    if (index == arr.length) {
        StringBuilder builder = new StringBuilder();
        for (Character c : charLine) {
            builder.append(c);
        }

        // 屏蔽字符中的所有字母不能同时在输出的字符串出现
        if (isContainsNoStr(builder.toString(), noStr)) {
            list.add(builder.toString());
        }
        return;
    }

    for (int i = 0; i < arr[index].length(); i++) {
        charLine.addLast(arr[index].charAt(i));
        solution(arr, index + 1, list, charLine, noStr);
        charLine.removeLast();
    }
}

/**
 * 是否包含屏蔽字符串
 *
 * 屏蔽字符中的所有字母不能同时在输出的字符串出现
 */
public static boolean isContainsNoStr(String s, String noStr) {
    boolean flag = false;
    // 要求按照数字的顺序组合字母字符串
    for (int i = 0; i < noStr.length(); i++) {
        if (!s.contains(noStr.charAt(i) + "")) {
            flag = true;
            break;
        }
    }
    return flag;
}

/**
 * 每个数字对应多个字母
 */
private static Map<Integer, String> hashMap = new HashMap<Integer, String>();

static {
    hashMap.put(0, "abc");
    hashMap.put(1, "def");
    hashMap.put(2, "ghi");
    hashMap.put(3, "jkl");
    hashMap.put(4, "mno");
    hashMap.put(5, "pqr");
    hashMap.put(6, "st");
    hashMap.put(7, "uv");
    hashMap.put(8, "wx");
    hashMap.put(9, "yz");
}

5. 测试

在这里插入图片描述

6.解题思路

在这里插入图片描述

  1. 读取输入的数字字符串 numbers
  2. 读取输入的屏蔽字符串 noStr
  3. 创建一个空的字符串列表 list 用于存储不包含屏蔽字符串的字符串组合。
  4. 创建一个字符串数组 arr,长度为 numbers 的长度,用于存储数字对应的字母组合。
  5. 遍历 numbers 中的每个数字,将对应的字母组合存入 arr 数组。
  6. 初始化索引 index 为 0,创建一个空的字符链表 charLine,用于存储合格的字母集合。
  7. 调用 solution 方法,传入 arr 数组、indexlistcharLinenoStr 进行递归处理。
  8. solution 方法中,如果 index 等于 arr 的长度,表示已经遍历完所有数字对应的字母组合,将 charLine 中的字母按顺序组成字符串 builder
  9. 调用 isContainsNoStr 方法,判断 builder 是否包含屏蔽字符串 noStr
  10. 如果不包含,则将 builder 添加到 list 中。
  11. 否则,返回上一层递归。
  12. solution 方法中,遍历当前数字对应的字母组合的每个字母,将字母添加到 charLine 中,并递归调用 solution 方法,将 index 值加1。
  13. 递归完成后,将最后一个添加的字母从 charLine 中移除,回溯到上一层递归。
  14. 输出 list 列表中的所有字符串,使用逗号分隔。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android:如何从源码编译OpenCV4Android库

原文摘自知乎网友稚晖的文章《如何从源码编译OpenCV4Android库》 https://blog.csdn.net/LateLinux/article/details/111149544 我在这里根据自己的经验&#xff0c;增加一些备注。 1.需要的工具和源码&#xff1a; opencv4.1&#xff08;opencv4.6也可以编译通过&#xff09…

跟随林曦,做自己的“生活家”

时代在以加速度的方式变化&#xff0c;让人难以从容。而当我们陷于横向的比较系统&#xff0c;权衡着卷、躺时&#xff0c;也有人在探寻另一条纵向的路——向古人学习&#xff0c;以传统美学关照和滋养当下生活。      立夏之际&#xff0c;水墨画家林曦的新作《无用之美》…

数据结构【链表】看完还怕拿不下链表?

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

推荐5款提高生活和工作效率的好帮手

在这个数字化时代,软件工具已经深深地影响和改变了我们的生活和工作。有着各种各样的软件工具,它们都可以在特定的领域内让我们变得更加高效,完成复杂的任务。选择一款适合你的软件工具,不但可以极大地释放生产力,也可以让生活变得更加便捷。 1.桌面图标管理工具——TileIconi…

阿里开源!集成了 AIGC 的免费数据库工具:Chat2DB

今天推荐的这个项目是「Chat2DB」&#xff0c;一款开源免费的数据库客户端工具&#xff0c;支持 Windows、Mac 本地安装&#xff0c;也支持服务器端部署&#xff0c;Web 网页访问。 和传统的数据库客户端软件 Navicat、DBeaver 相比 Chat2DB 集成了 AIGC 的能力&#xff0c;能…

基于LLMs的多模态大模型(PALM-E,ArtGPT-4,VPGTrans )

这个系列已经更文一些了&#xff0c;如果有新的文章会继续补充&#xff1a; 基于LLMs的多模态大模型&#xff08;Visual ChatGPT&#xff0c;PICa&#xff0c;MM-REACT&#xff0c;MAGIC&#xff09;基于LLMs的多模态大模型&#xff08;Flamingo, BLIP-2&#xff0c;KOSMOS-1&…

2023年DAMA-CDGA/CDGP认证合肥/厦门/长春/深圳可以报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【MySQL】实验十 E-R图

文章目录 1. 学校2. 院系3. 图书馆4. 舰队5. 工厂6. 网购7. 公司1. 学校 设有如下实体: 班主任:工号、姓名、电话 班级:班号、专业、毕业总学分 学生:学号、姓名、性别、年龄 课程:课程号、课程名 上述实体中存在如下联系: (1)一个班主任管理一个班级,一个班级由一个…

小兔鲜--项目总结 2

目录 登录-表单校验实现 表单如何进行校验 表单校验步骤 自定义校验规则 整个表单的内容验证 登录-基础登录业务实现 登录业务流程 Pinia管理用户数据 如何使用Pinia管理数据 关键代码总结 登录-Pinia用户数据持久化 持久化用户数据说明 ​编辑关键步骤总结和插件运行机…

基于 JMeter 实现 WEB 项目性能测试,环境搭建与测试用例编写

目录 前言&#xff1a; 一、JDK 安装 二、Tomcat 安装 三、Redis 安装 四、数据库安装 五、WEB 项目搭建 六、性能测试项目搭建 七、总结 前言&#xff1a; 性能测试是软件开发中必不可少的一环&#xff0c;它可以帮助开发者提高程序的稳定性&#xff0c;优化性能&…

【产品经理】产品体验报告的思路

&#xff08;一&#xff09;产品概述 &#xff08;1&#xff09;体验环境 对于app来说&#xff0c;无非就是体验产品所用的机型&#xff0c;系统&#xff0c;然后app版本&#xff0c;体验时间&#xff0c;体验人等方面的信息。 &#xff08;2&#xff09;产品的概括或简介说…

基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)

当LLMs已经拥有了极强的对话能力后&#xff0c;如何使其拥有视觉和语音等多模态能力是紧接而来的热点&#xff08;虽然GPT4已经有了&#xff09;&#xff0c;这个系列将不定期更新一些利用LLMs做多模态任务的文章。 直觉上&#xff0c;如果直接训练一个类似chatgpt架构的多模态…

7种PCB走线方式

01电源布局布线相关 数字电路很多时候需要的电流是不连续的&#xff0c;所以对一些高速器件就会产生浪涌电流。 如果电源走线很长&#xff0c;则由于浪涌电流的存在进而会导致高频噪声&#xff0c;而此高频噪声会引入到其他信号中去。 而在高速电路中必然会存在寄生电感和寄…

SSM 如何使用 ShardingSphere 实现数据库分库分表

SSM 如何使用 ShardingSphere 实现数据库分库分表 简介 在大规模数据应用场景下&#xff0c;单一数据库可能无法承载高并发的读写操作。为了解决这个问题&#xff0c;一种常见的方式是使用数据库分库分表技术。ShardingSphere 是一个支持多种关系型数据库的分布式数据库中间件…

带您看懂全国产串口服务器!如何使用一看便知

不可否认&#xff0c;目前工业现场仍然会有很多串口设备的存在&#xff0c;对于这些串口设备&#xff0c;如果想要联网&#xff0c;就必须要转换成网络接口&#xff0c;这时候就会用到全国产串口服务器。 全国产串口服务器提供串口转网络功能&#xff0c;能够将RS-232/485/422串…

盐城北大青鸟“北大青鸟杯”IT精英挑战赛设中心评审隆重开赛

为积极响应北大青鸟总部开展第十届“北大青鸟杯”全国IT精英挑战赛的号召&#xff0c;成就学员们的IT梦想&#xff0c;“北大青鸟杯”IT精英挑战赛&#xff08;设计组&#xff09;盐城卓晨中心评审于2023年5月25日下午1:00在人才大厦306教室正式开赛&#xff01; ​ 赛前&a…

【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

报表控件FastReport使用指南——使用NuGet包创建PDF文档

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…

低代码平台简介(10家国产化低代码平台详细介绍)

低代码平台&#xff1a;一个号称能在几分钟的时间里开发一套企业内部都可使用的系统开发工具。 本人曾做过一个测试&#xff0c;2人&#xff0c;历时8小时&#xff0c;用低代码平台成功搭建出一套“客户管理系统”。该系统所需要的15个子模块与40个界面。同样的功能如果用传统编…

什么是 sudo,为什么它如此重要?

在当今的技术世界中&#xff0c;Linux 操作系统广泛应用于各种环境&#xff0c;包括个人计算机、服务器和嵌入式设备。作为一种强大的开源操作系统&#xff0c;Linux 提供了丰富的安全功能&#xff0c;以保护系统和用户的数据安全。在 Linux 安全领域中&#xff0c;sudo 是一项…