华为OD机试 - 考古学家 - 递归(Java 2024 D卷 200分)

news/2024/7/8 3:57:51 标签: 华为od, java, python

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有一个考古学家发现一个石碑,但是很可惜发现时其已经断成多段。

原地发现N个断口整齐的石碑碎片,为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?

备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后的碑文内容,仅相同碎片间的位置变化不影响组合。

二、输入描述

第一行输入N,N表示石碑碎片的个数

第二行依次输入石碑碎片上的文字内容S共有N组

三、输出描述

输出石碑文字的组合(按照升序排列),行尾无多余空格

1、输入

3
a b c

2、输出

abc
acb
bac
bca
cab
cba

四、解题思路

我们需要计算复原后的石碑文字组合数,这实际上涉及字符串的全排列问题,并且要去除重复的组合。具体步骤如下:

  1. 输入解析:
    • 读取石碑碎片的个数 N。
    • 读取石碑碎片上的文字内容,并存储在一个列表中。
  2. 去重和排序:
    • 为了确保结果是唯一且按升序排列的,需要对碎片进行去重和排序。
  3. 计算组合:
    • 生成所有可能的组合(全排列),并去除重复的组合。
    • 使用 set 数据结构来存储这些组合,以自动去重。
  4. 输出结果:
    • 对组合结果进行排序,并按照要求的格式输出。

五、Java算法源码

java">public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取石碑碎片的个数 N
        int N = scanner.nextInt();
        scanner.nextLine(); // 读取换行符

        // 读取石碑碎片上的文字内容
        String[] fragments = new String[N];
        for (int i = 0; i < N; i++) {
            fragments[i] = scanner.next();
        }

        // 关闭Scanner
        scanner.close();

        // 获取复原后的石碑文字组合
        List<String> combinations = getCombinations(fragments);

        // 输出结果
        for (String combination : combinations) {
            System.out.println(combination);
        }
    }

    // 获取复原后的石碑文字组合
    private static List<String> getCombinations(String[] fragments) {
        // 使用Set去重并排序
        Set<String> uniqueCombinations = new TreeSet<>();
        // 用于存储当前组合
        List<String> combination = new ArrayList<>();
        boolean[] visited = new boolean[fragments.length];

        // 生成所有组合
        generateCombinations(fragments, visited, combination, uniqueCombinations);

        return new ArrayList<>(uniqueCombinations);
    }

    // 递归生成所有组合
    private static void generateCombinations(String[] fragments, boolean[] visited, List<String> combination, Set<String> uniqueCombinations) {
        if (combination.size() == fragments.length) {
            // 将当前组合加入Set
            uniqueCombinations.add(String.join("", combination));
            return;
        }

        for (int i = 0; i < fragments.length; i++) {
            if (visited[i]) continue;
            visited[i] = true;
            combination.add(fragments[i]);
            generateCombinations(fragments, visited, combination, uniqueCombinations);
            // 回溯
            combination.remove(combination.size() - 1);
            visited[i] = false;
        }
    }
}

六、效果展示

1、输入

3
a b ab

2、输出

aabb
abab
abba
baab
baba

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5536305.html

相关文章

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果&#xff0c;但是对应的时间戳往往不准确&#xff0c;而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外&#xff0c;他们在处理长音频时通过缓冲转录

如何创建一个基本的Mojolicious Web应用:探索Perl的现代Web框架

如何创建一个基本的Mojolicious Web应用&#xff1a;探索Perl的现代Web框架 Mojolicious是一个用Perl编写的简单、优雅的Web开发框架&#xff0c;它提供了一套丰富的工具和方法&#xff0c;让开发者能够快速构建高性能的Web应用。本文将详细介绍如何创建一个基本的Mojolicious…

如何在Ubuntu 14.04上安装和配置Postfix作为仅发送的SMTP服务器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Postfix 是一个 MTA&#xff08;Mail Transfer Agent&#xff09;&#xff0c;用于发送和接收电子邮件的应用程序。在本教程中&am…

Java中的内存数据库与缓存技术

Java中的内存数据库与缓存技术 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 内存数据库的概念与优势 1.1 什么是内存数据库&#xff1f; 内存数据库是…

[C++]——同步异步日志系统(2)

同步异步日志系统 一、 不定参函数1.1 不定参宏函数的使用1.2 C 语言中不定参函数的使用1.3 C不定参数使用 二、设计模式2.1 单列模式2.2 工厂模式2.3 建造者模式2.4 代理模式 在我们开发同步异步日志系统之前&#xff0c;需要了解一些相关的技术知识。 一、 不定参函数 在初学…

51单片机通过控制寄存器控制设备,那么程序中变量的运算职责由谁完成的呢

在51单片机&#xff08;或更广泛地说&#xff0c;在任何微控制器或微处理器系统中&#xff09;的程序执行过程中&#xff0c;变量的运算职责主要由中央处理器&#xff08;CPU&#xff09;完成。CPU 负责执行程序中的指令&#xff0c;包括对各种变量进行算术和逻辑运算。 当你编…

前端代码规范 - 日志打印规范

在前端开发中&#xff0c;随着项目迭代升级&#xff0c;日志打印逐渐风格不一&#xff0c;合理的日志输出是监控应用状态、调试代码和跟踪用户行为的重要手段。一个好的日志系统能够帮助开发者快速定位问题&#xff0c;提高开发效率。本文将介绍如何在前端项目中制定日志输出规…

访问节点和创建节点的方法都有什么?

访问节点的方法&#xff1a;1、使用ownerDocument属性&#xff1b;2、使用parentNode属性&#xff1b;3、使用childNodes属性&#xff1b;4、使用firstChild属性&#xff1b;5、使用lastChild属性&#xff1b;6、使用nextSibling属性等。 javascript中创建节点的方法&#xff1…