2025华为OD机试题库(按算法分类):2025华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)。
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。
单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。
相似单词说明:
给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,那么定义Y是X的相似单词,如abc、bca即为相似单词(大小写是不同的字母,如a和A算两个不同字母)。
字典序排序: 大写字母<小写字母。同样大小写的字母,遵循26字母顺序大小关系。即A<B<C<…<X<Y<Z<a<b<c<…<x<y<z。
如Bac<aBc<acB<cBa。
二、输入描述
第一行为给定的单词个数N(N为非负整数);
从第二行到第N+1行是具体的单词(每行一个单词);
最后一行是指定的待检测单词(用于检测上面给定的单词中哪些是与该指定单词是相似单词,该单词可以不是上面给定的单词);
三、输出描述
从给定的单词组中,找出指定单词的相似单词,并且按照从小到大字典序排列输出,中间以空格隔开;
如果不存在,则输出null(字符串null)。
四、测试用例
测试用例1
1、输入
4
abc
bca
cab
cba
abc
2、输出
abc bca cab cba
3、说明
目标单词 “abc” 排序后为 “abc”。
所有输入单词排序后均为 “abc”,均为异序词。
排序后按字典序输出为:“abc” < “bca” < “cab” < “cba”。
测试用例2
1、输入
5
Abc
acb
bCa
Cba
abc
abc
2、输出
abc acb
3、说明
目标单词 “abc” 排序后为 “abc”(全小写)。
“Abc” 排序后为 “Abc”(由于大写字母ASCII码较小,与 “abc” 不同);
“acb” 排序后为 “abc”;
“bCa” 和 “Cba” 排序后都为 “Cab”(包含大写字母),不匹配;
因此仅 “abc” 与 “acb” 匹配,按字典序排序后输出 “abc acb”。
五、解题思路
- 读取输入的单词个数
N
。 - 创建一个长度为
N
的字符串数组words
,并读取输入的单词。 - 读取输入的待检测单词
targetWord
。 - 创建一个空的字符串列表
similarWords
用于存储相似单词。 - 调用
findSimilarWords
方法,传入单词数组words
和待检测单词targetWord
,获取相似单词列表similarWords
。 - 如果
similarWords
列表为空,输出字符串 “null”。 - 否则,对
similarWords
列表进行字典序排序。 - 使用字符串连接方法将
similarWords
列表中的相似单词按空格连接成一个字符串,并输出。
六、Python算法源码
# -*- coding: utf-8 -*-
# 导入系统模块
import sys
def sort_word(word):
# 将字符串转换为字符列表,然后排序,再组合成新字符串返回
return ''.join(sorted(word))
def main():
# 从标准输入中读取所有行数据,并去掉结尾换行符
lines = sys.stdin.read().splitlines()
# 第1行为单词个数,转换为整数
N = int(lines[0])
# 从第2行到第N+1行为字典中的单词
words = [lines[i+1] for i in range(N)]
# 最后一行为目标单词
target = lines[N+1]
# 得到目标单词排序后的形式
target_sorted = sort_word(target)
# 用于存放与目标单词相似的单词
same_list = []
# 遍历每个单词,判断其排序后是否与目标相同
for word in words:
if sort_word(word) == target_sorted:
same_list.append(word)
# 如果没有匹配的单词,则输出 "null"
if not same_list:
print("null")
return
# 按照字典序排序,Python默认字符串排序符合题目要求(大写字母 < 小写字母)
same_list.sort()
# 用空格将单词连接后输出
print(" ".join(same_list) + " ")
if __name__ == '__main__':
main()
七、JavaScript算法源码
// 引入 readline 模块用于读取标准输入
const readline = require('readline');
// 创建 readline 接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
// 定义一个数组存储输入的每一行
let lines = [];
// 监听每行输入
rl.on('line', function(line) {
lines.push(line);
});
// 当输入结束时执行
rl.on('close', function() {
// 第一行为单词个数,转换为数字
let N = parseInt(lines[0]);
// 从第二行到第N+1行为字典中的单词
let words = [];
for (let i = 0; i < N; i++) {
words.push(lines[i+1]);
}
// 最后一行为待检测的目标单词
let target = lines[N+1];
// 定义函数对单词进行字符排序
function sortWord(word) {
// 将字符串拆分为数组,排序后再组合成字符串
return word.split('').sort().join('');
}
// 得到目标单词排序后的标准形式
let targetSorted = sortWord(target);
// 定义数组存放与目标单词相似的单词
let sameList = [];
// 遍历字典中的每个单词,比较排序结果
for (let i = 0; i < words.length; i++) {
if (sortWord(words[i]) === targetSorted) {
sameList.push(words[i]);
}
}
// 如果没有相似单词,输出 "null"
if (sameList.length === 0) {
console.log("null");
return;
}
// 按字典序排序,JavaScript的默认字符串排序满足题目要求
sameList.sort();
// 用空格连接单词后输出,末尾加空格
console.log(sameList.join(' ') + " ");
});
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 定义最大单词长度
#define MAX_LEN 105
// 定义一个函数用于排序单词中的字符,返回排序后的结果
void sortWord(const char *word, char *sortedWord) {
int len = strlen(word);
// 复制原单词到临时数组
strcpy(sortedWord, word);
// 对字符数组进行排序,使用简单的冒泡排序
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
// 比较字符ASCII值,若顺序错误则交换
if (sortedWord[j] > sortedWord[j+1]) {
char temp = sortedWord[j];
sortedWord[j] = sortedWord[j+1];
sortedWord[j+1] = temp;
}
}
}
}
int cmpStr(const void *a, const void *b) {
// 用于 qsort 的字符串比较函数
return strcmp(*(const char **)a, *(const char **)b);
}
int main() {
int N;
// 读取单词个数
if (scanf("%d", &N) != 1) return 1;
// 为存储所有单词分配数组(指针数组)
char **words = (char **)malloc(N * sizeof(char *));
// 为每个单词分配内存,并读取单词
for (int i = 0; i < N; i++) {
words[i] = (char *)malloc(MAX_LEN * sizeof(char));
scanf("%s", words[i]);
}
// 读取目标单词
char target[MAX_LEN];
scanf("%s", target);
// 得到目标单词排序后的标准形式
char targetSorted[MAX_LEN];
sortWord(target, targetSorted);
// 定义数组存放匹配的单词(最多N个)
char **sameList = (char **)malloc(N * sizeof(char *));
int count = 0;
// 临时数组用于排序每个单词
char sortedWord[MAX_LEN];
// 遍历所有单词,比较排序后的字符串
for (int i = 0; i < N; i++) {
sortWord(words[i], sortedWord);
if (strcmp(sortedWord, targetSorted) == 0) {
sameList[count] = words[i]; // 直接保存指针,不需要额外拷贝
count++;
}
}
// 如果没有匹配的单词,则输出 "null"
if (count == 0) {
printf("null");
} else {
// 使用 qsort 按字典序排序匹配单词,注意默认 strcmp 符合要求(大写字母 < 小写字母)
qsort(sameList, count, sizeof(char *), cmpStr);
// 输出匹配单词,每个单词后跟一个空格
for (int i = 0; i < count; i++) {
printf("%s ", sameList[i]);
}
}
// 释放内存
free(sameList);
// 注意:words数组中每个单词的内存不在此处释放(可根据需要释放)
free(words);
return 0;
}
九、C++算法源码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 包含 sort 函数
using namespace std;
// 定义一个函数,将字符串中的字符排序后返回
string sortWord(const string &word) {
// 将字符串转换为字符数组
string sorted = word;
// 利用 STL 的 sort 对字符进行排序
sort(sorted.begin(), sorted.end());
return sorted;
}
int main() {
ios::sync_with_stdio(false); // 提高输入输出效率
cin.tie(nullptr);
int N;
// 读取单词个数
cin >> N;
// 定义 vector 存储所有单词
vector<string> words(N);
for (int i = 0; i < N; i++) {
cin >> words[i];
}
// 读取目标单词
string target;
cin >> target;
// 得到目标单词排序后的标准形式
string targetSorted = sortWord(target);
// 定义 vector 存储匹配的相似单词
vector<string> sameList;
// 遍历所有单词,判断排序后的结果是否与目标相同
for (int i = 0; i < N; i++) {
if (sortWord(words[i]) == targetSorted) {
sameList.push_back(words[i]);
}
}
// 如果没有找到相似单词,则输出 "null"
if (sameList.empty()) {
cout << "null";
return 0;
}
// 按照字典序排序,C++中 string 的 < 运算符满足要求(大写字母 < 小写字母)
sort(sameList.begin(), sameList.end());
// 输出匹配的单词,每个单词后跟一个空格
for (const auto &s : sameList) {
cout << s << " ";
}
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。