华为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、说明
五、解题思路
- 读取输入的字符串并将其拆分成字符串数组,表示密码本中的每一页密码。
- 将密码本的每个密码存入一个HashSet,以便于快速查找密码。
- 将密码数组按照密码长度进行降序排序,以确保我们能优先找到最长的密码。
- 对于每个密码,依次去掉末尾的字符,检查每个子密码是否存在于集合中。如果所有的子密码都存在,则返回这个密码。
- 如果找到了符合条件的密码,则输出这个密码;如果没有找到,则返回空字符串。
六、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在线答疑。