Bootstrap

华为OD机试 - 寻找相似单词(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

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”。

五、解题思路

  1. 读取输入的单词个数 N
  2. 创建一个长度为 N 的字符串数组 words,并读取输入的单词。
  3. 读取输入的待检测单词 targetWord
  4. 创建一个空的字符串列表 similarWords 用于存储相似单词。
  5. 调用 findSimilarWords 方法,传入单词数组 words 和待检测单词 targetWord,获取相似单词列表 similarWords
  6. 如果 similarWords 列表为空,输出字符串 “null”。
  7. 否则,对 similarWords 列表进行字典序排序。
  8. 使用字符串连接方法将 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算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

;