华为OD机试 - 构成指定长度字符串的个数(Python/JS/C/C++ 2024 E卷 100分)

news2025/4/18 16:56:35

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

给定 M 个字符( a-z ) ,从中取出任意字符(每个字符只能用一次)拼接成长度为 N 的字符串,要求相同的字符不能相邻。

计算出给定的字符列表能拼接出多少种满足条件的字符串,输入非法或者无法拼接出满足条件的字符串则返回 0 。

二、输入描述

给定长度为 M 的字符列表和结果字符串的长度 N ,中间使用空格(" ")拼接。

  • 0 < M < 30
  • 0 < N ≤ 5

三、输出描述

输出满足条件的字符串个数。

1、输入

dde 2

2、输出

2

3、说明

给定的字符为 dde ,果字符串长度为 2 ,可以拼接成 de、ed, 共 2 种。

四、测试用例

1、输入

java 3

2、输出

8

3、说明

满足条件的字符串:

[jav, jva, ava, ajv, avj, aja, vja, vaj]

五、解题思路

  1. 使用深度优先搜索(DFS)的方法生成所有可能的满足条件的字符串。
  2. 递归遍历每个字符,判断当前字符是否与前一个字符相同,如果相同则跳过。
  3. 根据选择或跳过的情况继续向下递归,直到生成长度为 N 的字符串。
  4. 统计满足条件的字符串的数量,并输出结果。

五、Python算法源码

def dfs(arr, last_index, length, used, count):
    # 当字符串长度达到要求,符合条件,count + 1
    if length == N:
        return count + 1

    for i in range(len(arr)):
        # 用过了 || 相邻的两个字符不可以相同 || 过滤掉重复排列
        if used[i] or (last_index >= 0 and arr[i] == arr[last_index]) or (i > 0 and arr[i] == arr[i - 1] and not used[i - 1]):
            continue

        used[i] = True
        count = dfs(arr, i, length + 1, used, count)
        used[i] = False

    return count


if __name__ == "__main__":
    str_input = input("请输入字符列表:")
    N = int(input("请输入字符串长度:"))

    if len(str_input) < N:
        print(0)
        exit()

    arr = list(str_input)

    # 检查字符是否都是小写字母
    for c in arr:
        if c < 'a' or c > 'z':
            print(0)
            exit()

    # 对字符列表进行排序
    arr.sort()

    # 递归调用DFS进行全排列生成符合条件的字符串
    used = [False] * len(arr)
    print(dfs(arr, -1, 0, used, 0))

六、JavaScript算法源码

function dfs(arr, lastIndex, length, used, count) {
    // 当字符串长度达到要求,符合条件,count + 1
    if (length === N) {
        return count + 1;
    }

    for (let i = 0; i < arr.length; i++) {
        // 用过了 || 相邻的两个字符不可以相同 || 过滤掉重复排列
        if (used[i] || (lastIndex >= 0 && arr[i] === arr[lastIndex]) || (i > 0 && arr[i] === arr[i - 1] && !used[i - 1])) {
            continue;
        }

        used[i] = true;
        count = dfs(arr, i, length + 1, used, count);
        used[i] = false;
    }

    return count;
}

function main() {
    const str = prompt("请输入字符列表:");
    N = parseInt(prompt("请输入字符串长度:"));

    if (str.length < N) {
        console.log(0);
        return;
    }

    let arr = str.split('');

    // 检查字符是否都是小写字母
    for (let c of arr) {
        if (c < 'a' || c > 'z') {
            console.log(0);
            return;
        }
    }

    // 对字符列表进行排序
    arr.sort();

    // 递归调用DFS进行全排列生成符合条件的字符串
    let used = new Array(arr.length).fill(false);
    console.log(dfs(arr, -1, 0, used, 0));
}

main();

七、C算法源码

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

int N;

int dfs(char *arr, int lastIndex, int length, bool *used, int count) {
    // 当字符串长度达到要求,符合条件,count+1
    if (length == N) {
        return ++count;
    }

    for (int i = 0; i < strlen(arr); i++) {
        if (used[i] || (lastIndex >= 0 && arr[i] == arr[lastIndex]) || (i > 0 && arr[i] == arr[i - 1] && !used[i - 1])) {
            continue;
        }

        used[i] = true;
        count = dfs(arr, i, length + 1, used, count);
        used[i] = false;
    }

    return count;
}

int main() {
    char str[100];
    printf("请输入字符列表:");
    scanf("%s", str);

    printf("请输入字符串长度:");
    scanf("%d", &N);

    if (strlen(str) < N) {
        printf("0\n");
        return 0;
    }

    // 检查字符是否都是小写字母
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] < 'a' || str[i] > 'z') {
            printf("0\n");
            return 0;
        }
    }

    // 对字符列表进行排序
    qsort(str, strlen(str), sizeof(char), (int (*)(const void *, const void *))strcmp);

    bool used[strlen(str)];
    memset(used, false, sizeof(used));

    // 递归调用DFS进行全排列生成符合条件的字符串
    printf("%d\n", dfs(str, -1, 0, used, 0));

    return 0;
}

八、C++算法源码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N;

int dfs(vector<char>& arr, int lastIndex, int length, vector<bool>& used, int count) {
    // 当字符串长度达到要求,符合条件,count + 1
    if (length == N) {
        return ++count;
    }

    for (int i = 0; i < arr.size(); i++) {
        if (used[i] || (lastIndex >= 0 && arr[i] == arr[lastIndex]) || (i > 0 && arr[i] == arr[i - 1] && !used[i - 1])) {
            continue;
        }

        used[i] = true;
        count = dfs(arr, i, length + 1, used, count);
        used[i] = false;
    }

    return count;
}

int main() {
    string str;
    cout << "请输入字符列表:";
    cin >> str;

    cout << "请输入字符串长度:";
    cin >> N;

    if (str.length() < N) {
        cout << 0 << endl;
        return 0;
    }

    vector<char> arr(str.begin(), str.end());

    // 检查字符是否都是小写字母
    for (char c : arr) {
        if (c < 'a' || c > 'z') {
            cout << 0 << endl;
            return 0;
        }
    }

    // 对字符列表进行排序
    sort(arr.begin(), arr.end());

    // 递归调用DFS进行全排列生成符合条件的字符串
    vector<bool> used(arr.size(), false);
    cout << dfs(arr, -1, 0, used, 0) << 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/2148515.html

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

相关文章

想高效开发,也许可以试试文件系统。。。

众所周知&#xff0c;4G-Cat.1模组的文件系统与数据传输速度、存储效率&#xff0c;以及数据安全性等有非常重要的关系&#xff0c;在应用开发中也非常重要。 今天我们来尝试Air201的实用示例——文件系统的使用 Air201文件系统的使用 合宙Air201资产定位模组——是一个集成超…

密集行人数据集 CrowdHumanvoc和yolo两种格式,yolo可以直接使用train val test已经划分好有yolov8训练200轮模型

密集行人数据集 CrowdHuman voc和yolo两种格式&#xff0c;yolo可以直接使用 train val test已经划分好 有yolov8训练200轮模型。 CrowdHuman 密集行人检测数据集 数据集描述 CrowdHuman数据集是一个专为密集行人检测设计的数据集&#xff0c;旨在解决行人密集场景下的检测挑…

【自动驾驶】控制算法(九)深度解析车辆纵向控制 | 从算法基础到 Carsim 仿真实践

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

【C语言】常见的C语言概念

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 什么是C语言2.C语言的历史3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点 4.VS项目和源文件、头文件介绍5. 第一个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII编…

【machine learning-十-梯度下降-学习率】

学习率 学习率不同的学习率 在梯度下降算法中&#xff0c;学习率的选择很重要&#xff0c;不恰当的选择&#xff0c;甚至可能导致损失发散&#xff0c;而非收敛&#xff0c;下面就看一下学习率的影响。 学习率 学习率是下图中的红框圈出来的部分&#xff0c; 学习率是模型的超…

Python 复制Excel 中的行、列、单元格

在Excel中&#xff0c;复制行、列和单元格是日常工作中经常需要进行的操作&#xff0c;它可以帮助你快速调整数据布局、复制数据模板或进行数据的批量处理。 本文将详细介绍如何使用Python将Excel中的行、列、或单元格范围复制到指定位置。 所需Python库 要使用Python操作Exc…

今天不写项目,聊聊后端面试吧

首先感谢大家之前的观看呀~兄弟们~ 这边把我去过几家公司面试的题目都写一下哈&#xff0c;像我大二下&#xff0c;就是前两个月7-9进了公司进行后端实习&#xff0c;哎.....反正就是学学学..话不多说~ 1.Frist 1.HashMap实现原理 HashMap是基于哈希表的Map接口的非同步实现…

Zabbix 部署----安装 Zabbix(监控服务器)

目录 zabbix 官网: 1、准备一台虚拟机 1.整理配置yum源(192.xx.xx.10) 2.设置主机名(192.xx.xx.10) 3.防火墙 4.selinux 2、准备Zabbix-repo 使用阿里提供的zabbixYUM源 3、安装Zabbix服务器 4、初始化数据库 1.安装数据库 2.启动数据库 3.授权zabbix账号 4.初始化…

数据结构强化(直播课)

应用题真题分析&备考指南 (三)线性表的应用 (六)栈、队列和数组的应用 &#xff08;四&#xff09;树与二叉树的应用 1.哈夫曼&#xff08;Huffman&#xff09;树和哈夫曼编码 2.并查集及其应用&#xff08;重要&#xff09; &#xff08;四&#xff09;图的基本应用 …

74、Python之函数式编程:深入理解惰性求值与生成器

引言 我们在过程式编程或者面向对象编程中&#xff08;当然也不局限于这些&#xff09;&#xff0c;涉及到计算、数据的转换处理时&#xff0c;通常是执行到对应的语句或者表达式时&#xff0c;就会完成计算或者数据处理。大多数场景下&#xff0c;这样立即计算的方式是没有问…

基于SpringBoot的社团管理系统【附源码】

基于SpringBoot的社团管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 5.1.2 社长信…

【kafka-04】kafka线上问题以及高效原理

Kafka系列整体栏目 内容链接地址【一】afka安装和基本核心概念https://zhenghuisheng.blog.csdn.net/article/details/142213307【二】kafka集群搭建https://zhenghuisheng.blog.csdn.net/article/details/142253288【三】springboot整合kafka以及核心参数详解https://zhenghui…

Golang | Leetcode Golang题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; func canPartition(nums []int) bool {n : len(nums)if n < 2 {return false}sum, max : 0, 0for _, v : range nums {sum vif v > max {max v}}if sum%2 ! 0 {return false}target : sum / 2if max > target {return false}dp …

修复 blender 中文输入 BUG (linux/wayland/GNOME/ibus)

blender 是一个很好的 开源 3D 建模/动画/渲染 软件, 功能很强大, 跨平台 (GNU/Linux, Windows 等系统都支持). 然而, 窝突然发现, blender 居然不支持中文输入 (linux) ! 这怎么能忍 ? 再一查, 不得了, 这居然是个 3 年前一直未解决的陈年老 BUG. 不行, 这绝对忍不了, 这个 …

关于单片机的技术原理及应用

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片机的技术原理及应用的相关内容&…

【Qt网络编程】Tcp多线程并发服务器和客户端通信

目录 一、编写思路 1、服务器 &#xff08;1&#xff09;总体思路widget.c&#xff08;主线程&#xff09; &#xff08;2&#xff09;详细流程widget.c&#xff08;主线程&#xff09; &#xff08;1&#xff09;总体思路chat_thread.c&#xff08;处理聊天逻辑线程&…

1、CycleGAN

1、CycleGAN CycleGAN论文链接&#xff1a;Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks CycleGAN 是一种流行的深度学习模型&#xff0c;用于图像到图像的转换任务&#xff0c;且不需要成对的数据。在介绍CycleGAN之前&#xff0c;必须…

Msf之Python分离免杀

Msf之Python分离免杀 ——XyLin. 成果展示&#xff1a; VT查杀率:8/73 (virustotal.com) 火绒和360可以过掉&#xff0c;但Windows Defender点开就寄掉了 提示&#xff1a;我用360测的时候&#xff0c;免杀过了&#xff0c;但360同时也申报了&#xff0c;估计要不了多久就寄…

《Linux运维总结:基于Ubuntu 22.04操作系统+x86_64架构CPU部署二进制mongodb 7.0.14分片集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 1、应用场景 当您遇到如下问题时,可以使用分片集群解决: a、 存储容量受单机限制,即磁盘资源遭遇瓶颈。 b、 读写能力受单机限制,可能是CPU、内…

开关磁阻电机(SRM)系统的matlab性能仿真与分析

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 SRM的基本结构 4.2 SRM的电磁关系 4.3 SRM的输出力矩 5.完整工程文件 1.课题概述 开关磁阻电机(SRM)系统的matlab性能仿真与分析&#xff0c;对比平均转矩vs相电流&#xff0c;转矩脉动vs相电流&a…