华为OD机试 - 最长的密码(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

小王正在进行游戏大闯关,有一个关卡需要输入一个密码才能通过,密码获得的条件如下:

在一个密码本中,每一页都有一个由26个小写字母组成的密码,每一页的密码不同,需要从这个密码本中寻找这样一个最长的密码, 从它的末尾开始依次去掉一位得到的新密码也在密码本中存在。

请输出符合要求的密码,如果有多个符合要求的密码,返回长度最大的密码。

若没有符合要求的密码,则返回空字符串。

二、输入描述

密码本由一个字符串数组组成,不同元素之间使用空格隔开,每一个元素代表密码本每一页的密码。

三、输出描述

一个字符串

四、测试用例

测试用例1:

1、输入

h he hel hell hello

2、输出

hello

3、说明

测试用例2:

1、输入

b ereddred bw bww bwwl bwwlm bwwln

2、输出

bwwlm

3、说明

五、解题思路

  1. 读取输入的字符串并将其拆分成字符串数组,表示密码本中的每一页密码。
  2. 将密码本的每个密码存入一个HashSet,以便于快速查找密码。
  3. 将密码数组按照密码长度进行降序排序,以确保我们能优先找到最长的密码。
  4. 对于每个密码,依次去掉末尾的字符,检查每个子密码是否存在于集合中。如果所有的子密码都存在,则返回这个密码。
  5. 如果找到了符合条件的密码,则输出这个密码;如果没有找到,则返回空字符串。

六、Python算法源码

# 导入集合模块
from collections import defaultdict

def find_longest_password(passwords):
    # 创建一个集合用于存储密码本中的密码
    password_set = set(passwords)
    
    longest_password = ""  # 存储符合条件的最长密码
    
    # 遍历每个密码
    for password in passwords:
        current = password  # 从当前密码开始
        
        # 检查当前密码的每个子密码
        while current:  # 当当前密码不为空
            if current not in password_set:  # 如果子密码不在集合中
                break  # 跳出循环
            current = current[:-1]  # 去掉末尾一个字符
        
        # 如果当前密码有效且长度大于已记录的最长密码
        if len(current) == 0 and len(password) > len(longest_password):
            longest_password = password  # 更新最长密码
            
    return longest_password  # 返回找到的最长密码

# 主程序入口
if __name__ == "__main__":
    # 读取输入字符串,并拆分为数组
    passwords = input().strip().split()
    
    # 调用方法获取符合条件的最长密码
    result = find_longest_password(passwords)
    
    # 输出结果
    print(result)

七、JavaScript算法源码

function findLongestPassword(passwords) {
    // 创建一个集合用于存储密码本中的密码
    const passwordSet = new Set(passwords);
    
    let longestPassword = "";  // 存储符合条件的最长密码
    
    // 遍历每个密码
    for (const password of passwords) {
        let current = password;  // 从当前密码开始
        
        // 检查当前密码的每个子密码
        while (current.length > 0) {  // 当当前密码不为空
            if (!passwordSet.has(current)) {  // 如果子密码不在集合中
                break;  // 跳出循环
            }
            current = current.slice(0, -1);  // 去掉末尾一个字符
        }
        
        // 如果当前密码有效且长度大于已记录的最长密码
        if (current.length === 0 && password.length > longestPassword.length) {
            longestPassword = password;  // 更新最长密码
        }
    }
    
    return longestPassword;  // 返回找到的最长密码
}

// 主程序入口
const input = require('fs').readFileSync('/dev/stdin', 'utf-8').trim();
const passwords = input.split(" ");  // 拆分输入为密码数组

// 调用方法获取符合条件的最长密码并输出结果
console.log(findLongestPassword(passwords));

八、C算法源码

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

#define MAX_LENGTH 100  // 定义最大长度

// 函数声明
char* findLongestPassword(char* passwords[], int n);

int main() {
    char* passwords[MAX_LENGTH];  // 用于存储密码
    char buffer[200];  // 用于读取输入
    int n = 0;  // 密码数量

    // 读取输入
    fgets(buffer, sizeof(buffer), stdin);
    
    // 按空格分割输入
    char* token = strtok(buffer, " ");
    while (token != NULL) {
        passwords[n++] = token;  // 存储每个密码
        token = strtok(NULL, " ");  // 获取下一个密码
    }

    // 调用函数获取符合条件的最长密码
    char* result = findLongestPassword(passwords, n);
    
    // 输出结果
    printf("%s\n", result);
    return 0;
}

char* findLongestPassword(char* passwords[], int n) {
    // 创建一个集合用于存储密码本中的密码
    char* passwordSet[MAX_LENGTH];
    int passwordSetSize = 0;
    
    // 将密码加入集合
    for (int i = 0; i < n; i++) {
        passwordSet[passwordSetSize++] = passwords[i];
    }
    
    char* longestPassword = "";  // 存储符合条件的最长密码
    
    // 遍历每个密码
    for (int i = 0; i < n; i++) {
        char* current = passwords[i];  // 从当前密码开始
        char temp[MAX_LENGTH];  // 用于存储当前密码的副本
        strcpy(temp, current);  // 复制当前密码

        // 检查当前密码的每个子密码
        while (strlen(temp) > 0) {  // 当当前密码不为空
            int found = 0;  // 标记是否找到
            for (int j = 0; j < passwordSetSize; j++) {
                if (strcmp(temp, passwordSet[j]) == 0) {  // 如果子密码在集合中
                    found = 1;  // 标记找到
                    break;  // 跳出循环
                }
            }
            if (!found) {
                break;  // 如果未找到,跳出循环
            }
            temp[strlen(temp) - 1] = '\0';  // 去掉末尾一个字符
        }
        
        // 如果当前密码有效且长度大于已记录的最长密码
        if (strlen(temp) == 0 && strlen(current) > strlen(longestPassword)) {
            longestPassword = current;  // 更新最长密码
        }
    }
    
    return longestPassword;  // 返回找到的最长密码
}

九、C++算法源码

#include <iostream>
#include <unordered_set>
#include <vector>
#include <string>

using namespace std;

string findLongestPassword(const vector<string>& passwords) {
    // 创建一个集合用于存储密码本中的密码
    unordered_set<string> passwordSet(passwords.begin(), passwords.end());
    
    string longestPassword;  // 存储符合条件的最长密码
    
    // 遍历每个密码
    for (const auto& password : passwords) {
        string current = password;  // 从当前密码开始
        
        // 检查当前密码的每个子密码
        while (!current.empty()) {  // 当当前密码不为空
            if (passwordSet.find(current) == passwordSet.end()) {  // 如果子密码不在集合中
                break;  // 跳出循环
            }
            current.pop_back();  // 去掉末尾一个字符
        }
        
        // 如果当前密码有效且长度大于已记录的最长密码
        if (current.empty() && password.length() > longestPassword.length()) {
            longestPassword = password;  // 更新最长密码
        }
    }
    
    return longestPassword;  // 返回找到的最长密码
}

// 主程序入口
int main() {
    string input;  // 用于读取输入
    getline(cin, input);  // 读取一行输入
    
    vector<string> passwords;  // 存储密码的数组
    string temp;  // 临时变量存储单个密码

    // 按空格分割输入并存入数组
    for (char c : input) {
        if (c == ' ') {
            passwords.push_back(temp);  // 添加密码
            temp.clear();  // 清空临时变量
        } else {
            temp += c;  // 添加字符到临时变量
        }
    }
    if (!temp.empty()) {
        passwords.push_back(temp);  // 添加最后一个密码
    }

    // 调用函数获取符合条件的最长密码并输出结果
    cout << findLongestPassword(passwords) << endl;
    return 0;
}


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

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

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

在这里插入图片描述

华为OD机试-2023真题的考点主要为以下几个类: 1. 数据结构与算法:考察对各种常用数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、查找、递归、动态规划等)的理解和应用能力,以及对时间复杂度和空间复杂度的析和优化。 2. 编程语言和语法:考察对编程语言(如C++Python等)的基本语法和特性的掌握程度,包括变量、运算符、控制流程、函数、类等。同时还要求考生熟练运用相关的标准库和常用的数据结构和算法。 3. 网络与操作系统:考察对计算机网络和操作系统的基本原理和常用技术的了解,包括网络通信、TCP/IP协议、进程管理、内存管理、文件系统等。要求考生理解并能解决相关的问题。 4. 数据库与SQL:考察对数据库的基本概念和原理的理解,包括数据模型、关系代数、SQL语言等内容。要求考生能够编写和优化SQL查询语句,处理常见的数据库操作和性能问题。 5. 系统设计与架构:考察对大型系统的设计和架构的理解,包括系统需求析、模块划、接口设计等。要求考生能够根据需求或场景提出可行的系统设计方案,并能解决相关的实际问题。 总体来说,华为OD机试-2023真题的考点比较全面,涵盖了计算机科学与技术的多个方面。考生需要具备扎实的数据结构与算法基础,熟悉常用编程语言和标准库的使用,了解网络和操作系统的基本原理,掌握数据库和SQL语言的基本知识,同时具备系统设计和架构的能力。只有在这些方面的基础上才能够应对各种考题,并取得优异的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值