华为OD机试 - 匿名信(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

电视剧《分界线Q》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字减下来,剪拼成匿名信。
现在一名举报人,希望借鉴这部片段,使用英文报刊为范本来剪拼举报信。
但为了增加文章的混淆程度,尽量避免每个单词中字母数量一致即可,不关注每个字母的顺序。
解释:单词n允许抄袭过n的字母组合。

报纸代表newspaper,匿名信代表anonymousLetter,求报纸内容是否可以拼成匿名信。

二、输入描述

第一行newspaper内容,包括1N个字符,并且空格分开

第二行anonymousLetter内容,包括1N个字符,并且空格分开。

newspaper和anonymousLetter的字符串中均为英文字母组成,且每个字母只能使用一次;

newspaper内容中的每个字符中字母顺序可以任意调整,但必须保证字符串的完整性(每个字符串不能有多余字母)

1 < N < 100,

1 <= newspaper.length,anonymousLetter.length <= 104

三、输出描述

如果报纸可以拼成匿名信返回true,否则返回false

四、测试用例

测试用例1:

1、输入

ab cd
ab

2、输出

true

3、说明

测试用例2:

1、输入

ab ef
aef

2、输出

false

3、说明

五、解题思路

  1. 读取输入,包括报纸内容和匿名信内容。
  2. 将报纸和匿名信中的每个单词进行字母排序,得到其“规范形式”。
    • 例如,单词“ab”排序后仍为“ab”,单词“aef”排序后为“aef”。
  3. 统计报纸中每种规范形式的单词出现次数,存入一个哈希映射 newspaperMap 中。
  4. 统计匿名信中每种规范形式的单词出现次数,存入另一个哈希映射 letterMap 中。
  5. 遍历匿名信中的每种规范形式,检查报纸中是否有足够数量的对应单词。
    • 如果报纸中某种规范形式的单词数量少于匿名信中需要的数量,则返回 false。
  6. 如果所有匿名信中的单词都在报纸中有足够的对应单词,则返回 true。

六、Python算法源码

# 导入所需模块
import sysdef calculate_total_cost(newspaper_words, letter_words):"""计算报纸内容是否可以拼成匿名信:param newspaper_words: 报纸中的单词列表:param letter_words: 匿名信中的单词列表:return: 如果可以拼成匿名信返回True,否则返回False"""# 使用字典统计报纸中每种规范形式的单词出现次数newspaper_map = {}for word in newspaper_words:sorted_word = ''.join(sorted(word))  # 将单词字母排序if sorted_word in newspaper_map:newspaper_map[sorted_word] += 1else:newspaper_map[sorted_word] = 1# 使用字典统计匿名信中每种规范形式的单词出现次数letter_map = {}for word in letter_words:sorted_word = ''.join(sorted(word))  # 将单词字母排序if sorted_word in letter_map:letter_map[sorted_word] += 1else:letter_map[sorted_word] = 1# 检查报纸中是否有足够的单词来组成匿名信for sorted_word, required_count in letter_map.items():available_count = newspaper_map.get(sorted_word, 0)if available_count < required_count:return False  # 如果报纸中对应单词数量不足,返回Falsereturn True  # 所有单词数量足够,返回Truedef main():# 读取标准输入的所有行,并去除多余空格lines = sys.stdin.read().splitlines()lines = [line.strip() for line in lines if line.strip()]# 检查输入是否至少包含两行if len(lines) < 2:print("false")return# 读取报纸内容,并分割成单词列表newspaper_words = lines[0].split()# 读取匿名信内容,并分割成单词列表letter_words = lines[1].split()# 调用函数计算结果can_form = calculate_total_cost(newspaper_words, letter_words)# 输出结果print("true" if can_form else "false")if __name__ == "__main__":main()

七、JavaScript算法源码

// 导入所需模块
const readline = require('readline');// 创建接口以读取标准输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let inputLines = [];// 读取每一行输入
rl.on('line', (line) => {inputLines.push(line.trim());// 当读取了至少两行输入时,开始处理if (inputLines.length === 2) {rl.close();}
});// 输入读取完成后处理
rl.on('close', () => {// 读取报纸内容并分割成单词数组const newspaperWords = inputLines[0].split(/\s+/);// 读取匿名信内容并分割成单词数组const letterWords = inputLines[1].split(/\s+/);// 计算报纸是否可以拼成匿名信const canForm = calculateTotalCost(newspaperWords, letterWords);// 输出结果console.log(canForm ? "true" : "false");
});/*** 计算报纸内容是否可以拼成匿名信* @param {string[]} newspaperWords 报纸中的单词数组* @param {string[]} letterWords 匿名信中的单词数组* @returns {boolean} 如果可以拼成匿名信返回true,否则返回false*/
function calculateTotalCost(newspaperWords, letterWords) {// 使用对象统计报纸中每种规范形式的单词出现次数const newspaperMap = {};for (let word of newspaperWords) {const sortedWord = sortLetters(word); // 将单词字母排序if (newspaperMap.hasOwnProperty(sortedWord)) {newspaperMap[sortedWord] += 1;} else {newspaperMap[sortedWord] = 1;}}// 使用对象统计匿名信中每种规范形式的单词出现次数const letterMap = {};for (let word of letterWords) {const sortedWord = sortLetters(word); // 将单词字母排序if (letterMap.hasOwnProperty(sortedWord)) {letterMap[sortedWord] += 1;} else {letterMap[sortedWord] = 1;}}// 检查报纸中是否有足够的单词来组成匿名信for (let sortedWord in letterMap) {const requiredCount = letterMap[sortedWord];const availableCount = newspaperMap[sortedWord] || 0;if (availableCount < requiredCount) {return false; // 如果报纸中对应单词数量不足,返回false}}return true; // 所有单词数量足够,返回true
}/*** 将单词中的字母按字母序排序,并返回排序后的字符串* @param {string} word 原始单词* @returns {string} 排序后的单词*/
function sortLetters(word) {return word.split('').sort().join('');
}

八、C算法源码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>// 定义最大单词数和最大单词长度
#define MAX_WORDS 10000
#define MAX_WORD_LENGTH 100// 比较函数,用于qsort
int cmp_char(const void *a, const void *b) {return (*(char*)a - *(char*)b);
}int main() {char newspaper_line[1000001]; // 假设每行最多100万字符char letter_line[1000001];// 读取报纸内容if (fgets(newspaper_line, sizeof(newspaper_line), stdin) == NULL) {printf("false\n");return 0;}// 读取匿名信内容if (fgets(letter_line, sizeof(letter_line), stdin) == NULL) {printf("false\n");return 0;}// 分割报纸内容成单词char *newspaper_words[MAX_WORDS];int newspaper_count = 0;char *token = strtok(newspaper_line, " \n");while (token != NULL && newspaper_count < MAX_WORDS) {newspaper_words[newspaper_count++] = token;token = strtok(NULL, " \n");}// 分割匿名信内容成单词char *letter_words[MAX_WORDS];int letter_count = 0;token = strtok(letter_line, " \n");while (token != NULL && letter_count < MAX_WORDS) {letter_words[letter_count++] = token;token = strtok(NULL, " \n");}// 使用哈希表模拟报纸中的单词频率// 由于C没有内置哈希表,这里使用排序和二分查找的方法// 首先,创建一个数组存储报纸中排序后的单词char **sorted_newspaper = (char**)malloc(newspaper_count * sizeof(char*));for (int i = 0; i < newspaper_count; i++) {int len = strlen(newspaper_words[i]);sorted_newspaper[i] = (char*)malloc((len + 1) * sizeof(char));strcpy(sorted_newspaper[i], newspaper_words[i]);qsort(sorted_newspaper[i], len, sizeof(char), cmp_char); // 排序字母}// 排序整个报纸单词数组// 使用指针数组排序for (int i = 0; i < newspaper_count - 1; i++) {for (int j = i + 1; j < newspaper_count; j++) {if (strcmp(sorted_newspaper[i], sorted_newspaper[j]) > 0) {char *temp = sorted_newspaper[i];sorted_newspaper[i] = sorted_newspaper[j];sorted_newspaper[j] = temp;}}}// 创建一个数组存储匿名信中排序后的单词char **sorted_letter = (char**)malloc(letter_count * sizeof(char*));for (int i = 0; i < letter_count; i++) {int len = strlen(letter_words[i]);sorted_letter[i] = (char*)malloc((len + 1) * sizeof(char));strcpy(sorted_letter[i], letter_words[i]);qsort(sorted_letter[i], len, sizeof(char), cmp_char); // 排序字母}// 排序匿名信中的单词for (int i = 0; i < letter_count - 1; i++) {for (int j = i + 1; j < letter_count; j++) {if (strcmp(sorted_letter[i], sorted_letter[j]) > 0) {char *temp = sorted_letter[i];sorted_letter[i] = sorted_letter[j];sorted_letter[j] = temp;}}}// 统计报纸中每种单词的频率// 使用两个数组存储唯一单词和对应频率char **unique_newspaper = (char**)malloc(newspaper_count * sizeof(char*));int *freq_newspaper = (int*)malloc(newspaper_count * sizeof(int));int unique_count = 0;for (int i = 0; i < newspaper_count; i++) {if (i == 0 || strcmp(sorted_newspaper[i], sorted_newspaper[i - 1]) != 0) {unique_newspaper[unique_count] = sorted_newspaper[i];freq_newspaper[unique_count] = 1;unique_count++;} else {freq_newspaper[unique_count - 1]++;}}// 统计匿名信中每种单词的频率char **unique_letter = (char**)malloc(letter_count * sizeof(char*));int *freq_letter = (int*)malloc(letter_count * sizeof(int));int unique_letter_count = 0;for (int i = 0; i < letter_count; i++) {if (i == 0 || strcmp(sorted_letter[i], sorted_letter[i - 1]) != 0) {unique_letter[unique_letter_count] = sorted_letter[i];freq_letter[unique_letter_count] = 1;unique_letter_count++;} else {freq_letter[unique_letter_count - 1]++;}}// 检查每个匿名信中的单词是否在报纸中有足够的数量int can_form = 1; // 默认可以for (int i = 0; i < unique_letter_count; i++) {// 使用二分查找在报纸中查找单词int left = 0;int right = unique_count - 1;int found = 0;while (left <= right) {int mid = left + (right - left) / 2;int cmp = strcmp(unique_letter[i], unique_newspaper[mid]);if (cmp == 0) {if (freq_newspaper[mid] < freq_letter[i]) {can_form = 0; // 不足}found = 1;break;} else if (cmp < 0) {right = mid - 1;} else {left = mid + 1;}}if (!found) {can_form = 0; // 未找到break;}if (can_form == 0) {break;}}// 输出结果if (can_form) {printf("true\n");} else {printf("false\n");}// 释放动态分配的内存for (int i = 0; i < newspaper_count; i++) {free(sorted_newspaper[i]);}free(sorted_newspaper);free(sorted_letter);free(unique_newspaper);free(freq_newspaper);free(unique_letter);free(freq_letter);return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;/*** 将字符串中的字母按字母序排序,并返回排序后的字符串* @param word 原始字符串* @return 排序后的字符串*/
string sortLetters(const string &word) {string sorted = word;sort(sorted.begin(), sorted.end());return sorted;
}int main(){ios::sync_with_stdio(false);cin.tie(0);string newspaper_line;string letter_line;// 读取报纸内容if (!getline(cin, newspaper_line)) {cout << "false\n";return 0;}// 读取匿名信内容if (!getline(cin, letter_line)) {cout << "false\n";return 0;}// 分割报纸内容成单词vector<string> newspaper_words;string word;stringstream ss_newspaper(newspaper_line);while (ss_newspaper >> word) {newspaper_words.push_back(word);}// 分割匿名信内容成单词vector<string> letter_words;stringstream ss_letter(letter_line);while (ss_letter >> word) {letter_words.push_back(word);}// 使用unordered_map统计报纸中每种规范形式的单词出现次数unordered_map<string, int> newspaper_map;for (const auto &w : newspaper_words) {string sorted_word = sortLetters(w); // 将单词字母排序newspaper_map[sorted_word]++;}// 使用unordered_map统计匿名信中每种规范形式的单词出现次数unordered_map<string, int> letter_map;for (const auto &w : letter_words) {string sorted_word = sortLetters(w); // 将单词字母排序letter_map[sorted_word]++;}// 检查报纸中是否有足够的单词来组成匿名信bool can_form = true;for (const auto &entry : letter_map) {const string &sorted_word = entry.first;int required_count = entry.second;int available_count = newspaper_map[sorted_word];if (available_count < required_count) {can_form = false;break;}}// 输出结果cout << (can_form ? "true" : "false") << "\n";return 0;
}

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

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550121.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全 白帽子】用技术合法挖漏洞,一个月能拿多少钱

现在很多白帽子&#xff08;网安工程师/渗透测试工程师&#xff09;都会在下班之后利用业余时间去补天之类的漏洞赏金平台挖漏洞&#xff0c;用技术合法给企业找出威胁存在&#xff0c;拿到漏洞赏金。 那么现在&#xff0c;一般人用网安技术挖漏洞一个月能拿多少钱&#xff1f…

C++进阶:AVL树保持平衡的秘诀

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ AVL树的底层实现代码&#xff1a;BSTree.h 钦某/Clearning 什么是AVL树&#xff1f; • AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1…

【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Linux Shell &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux基础IO &#x1f4d2;1. …

在编写vue3项目过程中,不希望ts校验怎么设置

问&#xff1a; 现在我查询了很多设置 可以看到&#xff0c;设置了很多关闭校验&#xff0c;但是仍然有报错提示&#xff0c;提示当前类型不正确&#xff0c;应该怎么办&#xff1f; 回答&#xff1a; 从其他人的博客中获取灵感&#xff0c;因为vscode的自己的设置了类型检查…

DL_语义分割(学习笔记)

文章目录 图像分割1 常见分类1.1 语义分割1.2 实例分割1.3 全景分割 2 语义分割2.1 模型评价指标2.2 常用数据集2.3 转置卷积2.4 膨胀卷积2.5 感受野2.6 双线性插值2.7 FCN 图像分割 1 常见分类 1.1 语义分割 定义&#xff1a;【只判断类别&#xff0c;无法区分个体】 语义分…

Tableau 瀑布图应用示例

通过探索 10 个示例&#xff0c;将瀑布图的应用拓展到更深层次的业务分析&#xff01; 作为一种直观展示数据变化的图表&#xff0c;瀑布图被广泛应用在业务分析中。同时&#xff0c;借助 Tableau 2024.2 中的 Viz Extensions&#xff0c;如今我们可以快速在 Tableau 中实现瀑布…

【YashanDB知识库】崖山数据库Outline功能验证

本文内容来自YashanDB官网&#xff0c;具体内容请见(https://www.yashandb.com/newsinfo/7488286.html?templateId1718516) 测试验证环境说明 测试用例说明 1、相同版本下&#xff0c;新增表数据量&#xff0c;使统计信息失效。优化器优先使用outline的计划。 2、相同版本下…

CHI trans简介--Retry

总目录&#xff1a; CHI协议简读汇总-CSDN博客 Retry trans flow requester发送一个请求&#xff0c;该请求没有protocol credit(P-Credit); 也就是说&#xff0c;该请求不保证completer一定能够接收该trans;completer返回一个retry resp, RetryAck, 给到Requester;completer再…

逻辑回归(上):函数求导过程自推 LaTex 语法

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

A股收复3000点!外资积极看涨,对冲基金净买入量创三年来新高

9月27日&#xff0c;A股开盘后跳空上涨&#xff0c;连续四天的大幅上涨&#xff0c;9月26日&#xff0c;上证指数收复3000点大关&#xff0c;让一些温州股民感到兴奋不已&#xff0c;一些炒股群里沸腾了。但对于行情走势&#xff0c;股民们产生了分歧&#xff0c;有人是逢高减仓…

SWAP、AquaCrop、FVCOM、Delft3D、SWAT、R+VIC、HSPF、HEC-HMS......

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&…

源2.0全面适配百度PaddleNLP,大模型开发开箱即用

近日&#xff0c;源2.0开源大模型与百度PaddleNLP完成全面适配。用户通过PaddleNLP&#xff0c;可快速调用源2.0预训练大模型&#xff0c;使用源2.0在语义、数学、推理、代码、知识等方面的推理能力&#xff0c;也可以使用特定领域的数据集对源2.0 进行微调&#xff0c;训练出适…

爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析

作品详情  运用Hadoop和MongoDB对得分能力数据进行分析&#xff1b;  运用python进行机器学习的模型调理&#xff0c;利用Pytorch框架对爬取的评论进行情感分析预测&#xff1b;  利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。

win10如何禁止指定程序运行?推荐这4个好用的方法,小白必入哦!(轻松拿捏!)

在Windows 10系统中&#xff0c;管理程序运行权限是维护系统安全和提升工作效率的重要手段。 无论是出于防止恶意软件入侵的考虑&#xff0c;还是为了规范员工的软件使用行为&#xff0c;禁止指定程序运行都是一项必备技能。 本文将为您介绍四种简单实用的方法&#xff0c;即便…

校企合作 | 宝兰德与西安航空职业技术学院共筑智慧教育新高地

在教育领域持续变革的今天&#xff0c;智慧教育作为提升教学质量、优化资源配置的关键策略&#xff0c;正逐步成为教育发展的主流趋势。近日&#xff0c;西安航空职业技术学院副校长郭红星、信息中心副主任李畅及主任李永锋等领导莅临宝兰德西安研发中心&#xff0c;双方就智慧…

el-upload不显示进度条

原因&#xff1a;我并没有用el-upload上面的action设置上传url&#xff0c;也没有用他自带的方法上传 这里我使用的是通过自定义接口手动上传&#xff0c;即点击外部按钮&#xff0c;将文件转换后调用接口将文件传参&#xff0c;拿到存储后转换回来的文件url&#xff0c;直接调…

如何处理各行业的DDOS问题

分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是网络安全领域最为常见且危害性极大的攻击方式之一。通过控制大量计算机、物联网终端或网络僵尸&#xff0c;攻击者能够向目标网站或服务器发送大量请求&#xff0c;从而耗尽其资源&#xff0c…

【docker】如何保存镜像以及分享社区

一、前言 在上篇博客中&#xff0c;我们已经下载了一个nginx的镜像&#xff0c;并且修改了它的内容为“111222”&#xff0c;命名为mynginx&#xff0c;现在我们就要把这个mynginx保存下来&#xff0c;并且分享但我们的docker_hub社区中&#xff01; 二、保存镜像 1、常用命名…

Vision Mamba UNet:一种新型医学图像分割网络

人工智能咨询培训老师叶梓 转载标明出处 在医学图像分割的研究中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;与变换器&#xff08;Transformer&#xff09;模型各有其优势和局限。CNN由于其有限的局部感受野&#xff0c;在捕获长距离信息时能力较弱&#xff1b;而尽…

深入理解 Nuxt.js 中的 app:data:refresh 钩子

title: 深入理解 Nuxt.js 中的 app:data:refresh 钩子 date: 2024/9/29 updated: 2024/9/29 author: cmdragon excerpt: 摘要:本文详细介绍了 Nuxt.js框架中的app:data:refresh钩子,包括其定义、用途、使用方法及实际应用案例。该钩子用于在数据刷新时执行额外处理,支持…