华为OD机试真题 - 考古学家 - 递归(Python/JS/C/C++ 2024 D卷 200分)

news2024/9/23 13:28:28

在这里插入图片描述

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

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

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

二、输入描述

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

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

三、输出描述

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

四、测试用例

1、输入

3
a b c

2、输出

abc
acb
bac
bca
cab
cba

3、输入

3
a b ab

4、输出

aabb
abab
abba
baab
baba

五、解题思路

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

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

六、Python算法源码

from itertools import permutations

def get_combinations(fragments):
    # 使用 set 去重并排序
    unique_combinations = set()

    # 生成所有组合
    for perm in permutations(fragments):
        unique_combinations.add(''.join(perm))

    # 返回排序后的列表
    return sorted(unique_combinations)

def main():
    # 读取石碑碎片的个数 N
    N = int(input())

    # 读取石碑碎片上的文字内容
    fragments = []
    for _ in range(N):
        fragments.append(input().strip())

    # 获取复原后的石碑文字组合
    combinations = get_combinations(fragments)

    # 输出结果
    for combination in combinations:
        print(combination)

if __name__ == "__main__":
    main()

七、JavaScript算法源码

function getCombinations(fragments) {
    // 使用 Set 去重并排序
    let uniqueCombinations = new Set();

    // 生成所有组合
    function generateCombinations(currentCombination, visited) {
        if (currentCombination.length === fragments.length) {
            uniqueCombinations.add(currentCombination.join(''));
            return;
        }

        for (let i = 0; i < fragments.length; i++) {
            if (visited[i]) continue;
            visited[i] = true;
            currentCombination.push(fragments[i]);
            generateCombinations(currentCombination, visited);
            // 回溯
            currentCombination.pop();
            visited[i] = false;
        }
    }

    generateCombinations([], Array(fragments.length).fill(false));

    // 返回排序后的数组
    return Array.from(uniqueCombinations).sort();
}

function main() {
    // 读取石碑碎片的个数 N
    const N = parseInt(prompt("Enter the number of fragments:"));

    // 读取石碑碎片上的文字内容
    let fragments = [];
    for (let i = 0; i < N; i++) {
        fragments.push(prompt("Enter fragment:").trim());
    }

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

    // 输出结果
    for (let combination of combinations) {
        console.log(combination);
    }
}

// 调用 main 函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

// 定义一个结构体来存储字符串集合
typedef struct {
    char **data;
    int size;
    int capacity;
} StringSet;

// 初始化字符串集合
StringSet* createSet(int capacity) {
    StringSet *set = (StringSet*)malloc(sizeof(StringSet));
    set->data = (char**)malloc(sizeof(char*) * capacity);
    set->size = 0;
    set->capacity = capacity;
    return set;
}

// 检查字符串是否在集合中
bool contains(StringSet *set, const char *str) {
    for (int i = 0; i < set->size; i++) {
        if (strcmp(set->data[i], str) == 0) {
            return true;
        }
    }
    return false;
}

// 将字符串添加到集合中
void add(StringSet *set, const char *str) {
    if (!contains(set, str)) {
        set->data[set->size] = strdup(str);
        set->size++;
    }
}

// 释放集合内存
void freeSet(StringSet *set) {
    for (int i = 0; i < set->size; i++) {
        free(set->data[i]);
    }
    free(set->data);
    free(set);
}

// 生成所有组合
void generateCombinations(char **fragments, bool *visited, char *currentCombination, int depth, int n, StringSet *uniqueCombinations) {
    if (depth == n) {
        add(uniqueCombinations, currentCombination);
        return;
    }

    for (int i = 0; i < n; i++) {
        if (visited[i]) continue;
        visited[i] = true;
        strcat(currentCombination, fragments[i]);
        generateCombinations(fragments, visited, currentCombination, depth + 1, n, uniqueCombinations);
        currentCombination[strlen(currentCombination) - strlen(fragments[i])] = '\0'; // 回溯
        visited[i] = false;
    }
}

int compareStrings(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b);
}

int main() {
    int N;

    // 读取石碑碎片的个数 N
    scanf("%d", &N);

    // 读取石碑碎片上的文字内容
    char **fragments = (char**)malloc(sizeof(char*) * N);
    for (int i = 0; i < N; i++) {
        fragments[i] = (char*)malloc(sizeof(char) * 100);
        scanf("%s", fragments[i]);
    }

    // 初始化集合用于存储组合
    StringSet *uniqueCombinations = createSet(10000);

    // 存储当前组合
    char currentCombination[1000] = "";
    bool visited[N];
    memset(visited, 0, sizeof(visited));

    // 生成所有组合
    generateCombinations(fragments, visited, currentCombination, 0, N, uniqueCombinations);

    // 对组合进行排序
    qsort(uniqueCombinations->data, uniqueCombinations->size, sizeof(char*), compareStrings);

    // 输出结果
    for (int i = 0; i < uniqueCombinations->size; i++) {
        printf("%s\n", uniqueCombinations->data[i]);
    }

    // 释放内存
    freeSet(uniqueCombinations);
    for (int i = 0; i < N; i++) {
        free(fragments[i]);
    }
    free(fragments);

    return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <algorithm>

using namespace std;

// 生成所有组合
void generateCombinations(vector<string>& fragments, vector<bool>& visited, string& currentCombination, set<string>& uniqueCombinations) {
    if (currentCombination.size() == fragments.size() * fragments[0].size()) {
        uniqueCombinations.insert(currentCombination);
        return;
    }

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

vector<string> getCombinations(vector<string>& fragments) {
    set<string> uniqueCombinations;
    string currentCombination;
    vector<bool> visited(fragments.size(), false);

    generateCombinations(fragments, visited, currentCombination, uniqueCombinations);

    return vector<string>(uniqueCombinations.begin(), uniqueCombinations.end());
}

int main() {
    int N;

    // 读取石碑碎片的个数 N
    cin >> N;

    // 读取石碑碎片上的文字内容
    vector<string> fragments(N);
    for (int i = 0; i < N; i++) {
        cin >> fragments[i];
    }

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

    // 输出结果
    for (const string& combination : combinations) {
        cout << combination << endl;
    }

    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

检查Index对象是否单调递减pandas.Index.is_monotonic_decreasing

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 检查Index对象是否单调递减 pandas.Index.is_monotonic_decreasing [太阳]选择题 题目代码中输出结果是&#xff1f; import pandas as pd idx1 pd.Index([1, 2, 3, 4, 5]) idx2 pd.Index…

抢鲜体验 PolarDB PG 15 开源版

unsetunsetPolarDB 商业版unsetunset 8 月&#xff0c;PolarDB PostgreSQL 版兼容 PostgreSQL 15 版本&#xff08;商业版&#xff09;正式发布上线。 当前版本主要增强优化了以下方面&#xff1a; 改进排序功能&#xff1a;改进内存和磁盘排序算法。 增强SQL功能&#xff1a;支…

SprinBoot+Vue餐饮连锁店管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

基于聚类与LSTM对比特币价格深度分析与预测

1.项目背景 比特币作为全球最具影响力的加密货币之一&#xff0c;其价格受到多种复杂因素的共同作用&#xff0c;包括市场情绪、政策变化、大型机构的投资行为等&#xff0c;这些因素在不同的市场阶段对比特币价格波动产生直接或间接的影响。通过对比特币市场的深入分析&#…

在java中使用网易邮箱发送邮件保姆级教程,从零开始,完美避开各种坑

背景,开源工作流引擎AntFlow,gitcode地址通知系统需要配置一个邮箱地址才能供用户展示发送邮件通知功能.最初在开发阶段我使用的是个人163邮箱,本来没什么问题.然而当注册一个新的网易邮箱并在配置里替换掉原来个人邮箱后,竟然出现535 Error: authentication failed 异常,经过网…

【orin-nx Linux下创建简单C++项目 CMake构建编译系统】

【注意】&#xff1a;需要安装gcc 和 cmake 安装视频 #.sh 文件添加权限 chmod x cmake-3.30.3-linux-aarch64.sh1、在root下创建一个文件夹testaubo 2、在testaubo文件夹下创建5个文件夹以及一个cmake文件 2.1、【src】 文件夹存放C的 .cpp文件2.2、【include】 文件夹存…

【计算机网络】TCP协议(下)

上篇我们介绍了三次握手四次挥手&#xff0c;这次继续来进行tcp的介绍。 1 TINE_WAIT与CLOSE_WAIT 我们先使用客户端作为左端&#xff0c;服务端作为右方 当我们客户端close时&#xff0c;就会发起两次挥手&#xff0c;此时服务端就会进入CLOSE_WAIT状态&#xff0c;只要服务端…

链表算法题(下)

在链表算法题&#xff08;上&#xff09;长中我们已经学习了一系列的链表算法题&#xff0c;那么在本篇中我们将继续来学习链表的算法题&#xff0c;接下来就继续来破解链表的算法题吧&#xff01; 1.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 通过以上…

基于yolov8的人脸检测计数系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的人脸检测计数系统是一种利用深度学习技术的先进解决方案&#xff0c;它以其高效、准确的特点在人脸检测领域脱颖而出。该系统以YOLOv8为核心算法&#xff0c;该算法作为YOLO系列的最新迭代&#xff0c;不仅继承了前代算法的优点&#xff0c;还在实时…

YOLOv8-obb训练自己的数据集

一、YOLO OBB 格式 YOLO OBB 格式通过四个角点指定边界框&#xff0c;其坐标在 0 和 1 之间归一化&#xff1a; class_index x1 y1 x2 y2 x3 y3 x4 y4 YOLO 在内部处理损失和产出。 xywhr 格式&#xff0c;表示边界框的中心点&#xff08;xy&#xff09;、宽度、高度和旋转角度…

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派5 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 今天就水一篇文章&#xff0c;用树莓派摄像头&…

NISP 一级 | 2.4 访问控制

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;访问控制基本概念 访问控制是针对越权使用资源的防御措施。 其目标是防止对任何资源&#xff08;如计算资源、通信资源或信息资源&#xff09;进行未授权的访问&#xff0c;从而…

BLIP3技术小结(xGen-MM (BLIP-3): A Family of Open Large Multimodal Models)

paperhttps://www.arxiv.org/abs/2408.08872githubhttps://github.com/salesforce/LAVIS/tree/xgen-mmOrg.Salesforce AI Research个人博客地址http://myhz0606.com/article/blip3 前置阅读&#xff1a;BLIP系列总结 核心思路 虽然过去BLIP系列对LMM发展起到至关重要的作用&…

Redis缓存常用的读写策略

缓存常用的读写策略 缓存与DB的数据不一致问题&#xff0c;大多数都是指DB的数据已经修改&#xff0c;而缓存中的数据还是旧数据的情况。 旁路缓存模式 对于读操作&#xff1a;基本上所有模式都是先尝试从缓存中读&#xff0c;没有的话再去DB读取&#xff0c;然后写到缓存中…

MSCKF7讲:特征管理与优化

MSCKF7讲&#xff1a;特征管理与优化 文章目录 MSCKF7讲&#xff1a;特征管理与优化1 Feature.h2 OptimizationConfig3 initializePosition三角化LM优化3.1 计算归一化坐标深度初值generateInitialGuess① 理论推导② 代码分析 3.2 计算归一化误差cost① 理论推导② 代码分析 3…

模型和算力看板:Compute DashBoard

AGI 之路 AGI&#xff08;通用人工智能&#xff09;是整个计算机科学的圣杯&#xff0c;算力的增长和模型能力的提升&#xff08;算法和数据&#xff09;缺一不可。作为一个新质生产力&#xff0c;构建一个合理的评价体系是常用的方法论。针对模型和算力的评价&#xff0c;有类…

【AutoX.js】选择器 UiSelector

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文&#xff1a;https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…

code agent-自动写代码的AI工具整理(2024)

文章目录 cursorReplit Agentgithub-copilot cursor https://www.cursor.com/ 界面类似VSCODE&#xff0c;集成多种先进功能的AI驱动的代码编辑器&#xff0c;智能代码编辑与补全、使用自然语言指令来编辑和修改代码、版本控制与代码审查、自动化测试等&#xff1b; Replit…

路径规划——RRT算法

路径规划——RRT算法 算法原理 RRT算法的全称是快速扩展随机树算法(Rapidly Exploring Random Tree)&#xff0c;它的思想是选取一个初始点作为根节点&#xff0c;通过随机采样&#xff0c;增加叶子节点的方式&#xff0c;生成一个随机扩展树&#xff0c;当随机树中的叶子节点…

基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践

作者&#xff1a;计缘 LLM Chat 应用大家应该都不陌生&#xff0c;这类应用也逐渐称为了我们日常的得力助手&#xff0c;如果只是个人使用&#xff0c;那么目前市面上有很多方案可以快速的构建出一个LLM Chat应用&#xff0c;但是如果要用在企业生产级别的项目中&#xff0c;那…