华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分)

2024-09-03 08:52

本文主要是介绍华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

给定一个连续不包含空格字符的字符串,该字符串仅包含英文小写字母及英文标点符号(逗号、句号、分号),同时给定词库,对该字符串进行精确分词。

说明:

  • 精确分词:字符串分词后,不会出现重叠。例如 “ilovechina”,不同切分后可得到 “i”, “love”, “china”。
  • 标点符号不分词,仅用于断句。
  • 词库:根据常识及词库统计出来的常用词汇。例如:dictionary={“i”,“love”,“china”,“ilovechina”,“lovechina”}。
  • 分词原则:采用分词顺序优先且最长匹配原则。“ilovechina”,假设分词结果[i,ilove,lo,love,ch,china,lovechina] 则输出 [ilove,china]
    • 错误输出:[i, lovechina],原因:“ilove” > 优先于 “lovechina” 成词。
    • 错误输出:[i, love, china],原因:“ilove” > “i”,遵循最长匹配原则。

二、输入描述

  1. 字符串长度限制:0 < length < 256
  2. 词库长度限制:0 < length < 100000
  3. 第一行输入待分词语句 “ilovechina”
  4. 第二行输入中文词库 “i, love, china, ch, na, ve, lo, this, is, the, word”

三、输出描述

按顺序输出分词结果 “i, love, china”

1、输入

ilovechina
i,love,china,ch,na,ve,lo,this,is,the,word

2、输出

i,love,china

3、说明

输入的字符串被按最长匹配原则分为 “i”, “love”, “china”。

四、测试用例

1、输入

ilovech
i,love,china,ch,na,ve,lo,this,is,the,word

2、输出

i,love,ch

3、说明

输入的字符串被按最长匹配原则分为 “i”, “love”, “ch”。

五、解题思路

  1. 解析输入:
    • 读取待分词的字符串。
    • 读取词库,并将其转换为一个集合(Set),以便于快速查找。
  2. 处理标点符号:
    • 标点符号仅用于断句,不参与分词。可以使用正则表达式将字符串按标点符号分割。
  3. 分词处理:
    • 对每个子字符串进行分词,遵循最长匹配原则。
    • 从字符串的第一个字符开始,尝试匹配最长的单词,如果匹配成功,将该单词加入结果集,继续处理剩下的部分。
  4. 输出结果:
    • 将所有子字符串的分词结果组合起来,并按要求格式输出。

六、Python算法源码

import redef segment(sentence, dictionary):result = []length = len(sentence)start = 0while start < length:longest_word = None# 从当前起始位置向后查找for end in range(start + 1, length + 1):word = sentence[start:end]if word in dictionary:if longest_word is None or len(word) > len(longest_word):longest_word = wordif longest_word is not None:result.append(longest_word)start += len(longest_word)else:start += 1return resultdef main():# 读取待分词语句input_string = input("请输入待分词语句:")# 读取词库dictionary_input = input("请输入词库:")# 将词库字符串解析成集合,方便后续查找dictionary = set(dictionary_input.split(","))# 使用正则表达式按标点符号将输入字符串分割成多个子字符串sentences = re.split(r'[,.]', input_string)# 存储分词结果result = []# 对每个子字符串进行分词处理for sentence in sentences:result.extend(segment(sentence.strip(), dictionary))# 按要求格式输出分词结果print(", ".join(result))if __name__ == "__main__":main()

七、JavaScript算法源码

function segment(sentence, dictionary) {const result = [];const length = sentence.length;let start = 0;while (start < length) {let longestWord = null;// 从当前起始位置向后查找for (let end = start + 1; end <= length; end++) {const word = sentence.substring(start, end);if (dictionary.has(word)) {if (longestWord === null || word.length > longestWord.length) {longestWord = word;}}}if (longestWord !== null) {result.push(longestWord);start += longestWord.length;} else {start += 1;}}return result;
}function main() {// 读取待分词语句const input = prompt("请输入待分词语句:");// 读取词库const dictionaryInput = prompt("请输入词库:");// 将词库字符串解析成集合,方便后续查找const dictionary = new Set(dictionaryInput.split(","));// 使用正则表达式按标点符号将输入字符串分割成多个子字符串const sentences = input.split(/[,.;]/);// 存储分词结果const result = [];// 对每个子字符串进行分词处理for (const sentence of sentences) {result.push(...segment(sentence.trim(), dictionary));}// 按要求格式输出分词结果console.log(result.join(", "));
}// 调用主函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_WORD_LENGTH 100
#define MAX_SENTENCE_LENGTH 1000
#define MAX_DICTIONARY_SIZE 100// 字符串切割函数,类似于Python的split()
char** split(const char* str, const char* delim, int* count) {char* str_copy = strdup(str); // 复制字符串,以免修改原字符串char* token = strtok(str_copy, delim);char** result = malloc(MAX_SENTENCE_LENGTH * sizeof(char*));*count = 0;while (token != NULL) {result[(*count)++] = strdup(token);token = strtok(NULL, delim);}free(str_copy);return result;
}// 判断词库中是否包含某个单词
int is_in_dictionary(char* word, char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH], int dict_size) {for (int i = 0; i < dict_size; i++) {if (strcmp(word, dictionary[i]) == 0) {return 1;}}return 0;
}// 分词函数,遵循最长匹配原则
void segment(char* sentence, char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH], int dict_size, char result[MAX_SENTENCE_LENGTH][MAX_WORD_LENGTH], int* result_count) {int length = strlen(sentence);int start = 0;*result_count = 0;while (start < length) {char longest_word[MAX_WORD_LENGTH] = "";int longest_length = 0;for (int end = start + 1; end <= length; end++) {char word[MAX_WORD_LENGTH];strncpy(word, sentence + start, end - start);word[end - start] = '\0';if (is_in_dictionary(word, dictionary, dict_size) && strlen(word) > longest_length) {strcpy(longest_word, word);longest_length = strlen(word);}}if (longest_length > 0) {strcpy(result[*result_count], longest_word);(*result_count)++;start += longest_length;} else {start++;}}
}int main() {char input[MAX_SENTENCE_LENGTH];char dictionary_input[MAX_SENTENCE_LENGTH];char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH];int dict_size = 0;// 读取待分词语句printf("请输入待分词语句:\n");fgets(input, MAX_SENTENCE_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';  // 去除换行符// 读取词库printf("请输入词库:\n");fgets(dictionary_input, MAX_SENTENCE_LENGTH, stdin);dictionary_input[strcspn(dictionary_input, "\n")] = '\0';  // 去除换行符// 将词库字符串解析成二维数组int word_count;char** words = split(dictionary_input, ",", &word_count);for (int i = 0; i < word_count; i++) {strcpy(dictionary[dict_size++], words[i]);free(words[i]);}free(words);// 使用标点符号将输入字符串分割成多个子字符串int sentence_count;char** sentences = split(input, ",.;", &sentence_count);// 存储分词结果char result[MAX_SENTENCE_LENGTH][MAX_WORD_LENGTH];int result_count;// 对每个子字符串进行分词处理for (int i = 0; i < sentence_count; i++) {segment(sentences[i], dictionary, dict_size, result, &result_count);for (int j = 0; j < result_count; j++) {if (i > 0 || j > 0) {printf(", ");}printf("%s", result[j]);}free(sentences[i]);}free(sentences);printf("\n");return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>using namespace std;// 字符串分割函数,类似于Python的split()
vector<string> split(const string &str, const string &delim) {vector<string> tokens;size_t prev = 0, pos = 0;do {pos = str.find_first_of(delim, prev);if (pos == string::npos) pos = str.length();string token = str.substr(prev, pos - prev);if (!token.empty()) tokens.push_back(token);prev = pos + 1;} while (pos < str.length() && prev < str.length());return tokens;
}// 判断词库中是否包含某个单词
bool is_in_dictionary(const string &word, const vector<string> &dictionary) {return find(dictionary.begin(), dictionary.end(), word) != dictionary.end();
}// 分词函数,遵循最长匹配原则
vector<string> segment(const string &sentence, const vector<string> &dictionary) {vector<string> result;size_t length = sentence.length();size_t start = 0;while (start < length) {string longest_word;size_t longest_length = 0;for (size_t end = start + 1; end <= length; ++end) {string word = sentence.substr(start, end - start);if (is_in_dictionary(word, dictionary) && word.length() > longest_length) {longest_word = word;longest_length = word.length();}}if (!longest_word.empty()) {result.push_back(longest_word);start += longest_length;} else {start++;}}return result;
}int main() {string input;string dictionary_input;// 读取待分词语句cout << "请输入待分词语句:" << endl;getline(cin, input);// 读取词库cout << "请输入词库:" << endl;getline(cin, dictionary_input);// 将词库字符串解析成集合,方便后续查找vector<string> dictionary = split(dictionary_input, ",");// 使用标点符号将输入字符串分割成多个子字符串vector<string> sentences = split(input, ",.;");// 存储分词结果vector<string> result;// 对每个子字符串进行分词处理for (const string &sentence : sentences) {vector<string> segmented = segment(sentence, dictionary);result.insert(result.end(), segmented.begin(), segmented.end());}// 按要求格式输出分词结果for (size_t i = 0; i < result.size(); ++i) {if (i > 0) {cout << ", ";}cout << result[i];}cout << endl;return 0;
}

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

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

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

在这里插入图片描述

这篇关于华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132560

相关文章

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦