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

news2024/9/29 14:22:32

在这里插入图片描述

华为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 sys

def 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] += 1
        else:
            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] += 1
        else:
            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  # 如果报纸中对应单词数量不足,返回False
    return True  # 所有单词数量足够,返回True

def 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.coloradmin.cn/o/2176987.html

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

相关文章

测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布

2024年9月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.3版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;接口导入功能支持导入Postman、JMX、HAR和MeterSphere格式的文件&#xff0c;接口场景的自定义请求步骤支持cURL快捷导入&#xff1b;测试管理方面…

大数据实时数仓Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

sql注入工具升级:自动化时间盲注、布尔盲注

项目地址&#xff1a;https://github.com/iamnotamaster/sql-injecter 给我之前写的sql注入脚本进行了一些升级&#xff0c;此文章就是对升级内容的分析&#xff0c;升级内容如下&#xff1a; 使用占位符foo来填充payload里需要经常修改的部分 自动判断循环 支持爆破和二分查…

UE4_Niagara基础实例—6、蓝图与粒子系统的通信

效果图&#xff1a; 分析&#xff1a; 通过键盘按键来修改粒子系统粒子的大小。 步骤&#xff1a; 1、粒子系统使用上一个实例的粒子系统&#xff0c;大体参数如下&#xff1a; 参数都是乱调的&#xff0c;自己可以随意设置&#xff0c;只注重方法而不在意好看&#xff0c;汗…

求5X5的次小值/次大值

我们知道&#xff0c;求最大值和最小值是比较容易的&#xff0c;就是通过分组判断&#xff0c;然后再次比较即可求出&#xff0c;那么求出次小值/次大值怎么实现呢&#xff0c;本文提供一个设计的思路。 以5x5为例&#xff0c;求出次小值&#xff0c; 第一步&#xff0c;先分…

H5 随机身份证号码、社会统一信用代码、手机号、名字、银行卡号码

平时注册可能会用到这些&#xff0c;原本用自己服务器搭了个&#xff0c;感觉纯前端的还能引入到项目中挺好的&#xff0c;之后再追加一些常用的随机数据&#xff0c;这样写表单应该就会好测试了(●’◡’●)。 在线链接 https://linyisonger.github.io/H5.Examples/?name./07…

华为OD机试 - 箱子之字形摆放(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【vue3】防抖与节流

1.防抖 &#xff08;多次触发 只执行最后一次&#xff09; 作用&#xff1a; 高频率触发的事件,在指定的单位时间内&#xff0c;只响应最后一次&#xff0c;如果在指定的时间内再次触发&#xff0c;则重新计算时间防抖类似于英雄联盟回城6秒&#xff0c;如果回城中被打断&…

基于Next.js和TailwindCss的TailwindCss

最近在研究 Next.js 和 TailwindCss &#xff0c;这两天没事的时候就搞了一个 c。 目前工具部署在 Vercel &#xff0c;欢迎各位体验&#xff08;能提出意见更好嘿嘿&#xff09; 体验地址&#xff1a; https://icon.999872.xyz/ 图片预览 &#x1f447;

DRF实操学习——商城

DRF实操学习——商城 1. 商城模型的设计2. 优化商品分类表1. 序列化器和查询集的优化2. 得到指定类目的所有商品 商品表1. 视图的基础权限等配置2. 增加上传商品图片的接口3. 优选商品接口 分析&#xff1a; 商品分类表商品表商品图片表&#xff1a;一个商品有多张图片 1. 商城…

(undone) MIT6.824 Lab1

参考&#xff1a;http://nil.csail.mit.edu/6.824/2021/labs/lab-mr.html task1: 熟悉讲义&#xff0c;尤其是搞明白如何运行测试程序(完成) ------------------------------------------------ start 先看 Introduction 我们的目标&#xff1a;构建一个MapReduce系统。 细节&…

数据结构_2.2、顺序表插入删除查找

1、线性表的顺序存储表示定义&#xff1a; 线性表&#xff1a;是具有相同数据类型的n &#xff08;n≥0&#xff09;个数据元素的有限序列 顺序表&#xff1a;用顺序存储的方式实现线性表 顺序存储&#xff1a;把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中&#…

前端大模型入门:实战篇之Vue3+Antdv+transformers+本地模型实现增强搜索

本文将之前的文章&#xff0c;实现一个场景的实战应用&#xff0c;包含代码等内容。利用纯前端实现增强的列表搜索&#xff0c;抛弃字符串匹配&#xff0c;目标是使用番茄关键字可以搜索到西红柿 1 准备工作 1.1 了解llm和web开发 web端的ai开发参考 前端大模型入门&#xff…

MPI程序实例:数值积分(π值计算)

目录 一、算法介绍 二、代码实现 一、算法介绍 本程序实例通过下面的公司计算定积分的近似值&#xff1a; (1) 其中为积分区间数&#xff0c;为积分步长&#xff0c;为积分区间的中点&#xff0c;被积函数。 假设总进程数为p&#xff08;程序中的numprocs变量&#xff09;&a…

判断JDK是否包含某个class

问题描述&#xff1a;今天遇到个问题&#xff0c;把oracle替换为openjdk&#xff0c;应用启动时&#xff0c;提示noclassdeffounderror 解决办法&#xff1a;先确认下环境里的jdk里是否包含这个class&#xff0c;进入jdk安装目录的/jre/lib&#xff0c;执行命令&#xff1a;ja…

tar命令:压缩、解压的好工具

一、命令简介 用途&#xff1a; tar​ 命令用于创建归档文件&#xff08;tarball&#xff09;&#xff0c;以及从归档文件中提取文件。 标签&#xff1a; 文件管理&#xff0c;归档。 特点&#xff1a; 归档文件可以保留原始文件和目录的层次结构&#xff0c;通常使用 .tar ​…

每日OJ题_牛客_HJ108求最小公倍数_C++_Java

目录 牛客_HJ108求最小公倍数_C_Java 题目解析 C代码 Java代码 牛客_HJ108求最小公倍数_C_Java 求最小公倍数_牛客题霸_牛客网 题目解析 A 和 B 的最小公倍数 A * B / 两者的最大公约数。最大公约数&#xff1a;辗转相除法。 C代码 #include <iostream> #includ…

C语言—顺序表(含通讯录项目)

目录 一、顺序表的概念及结构 二、顺序表的分类 &#xff08;2.1&#xff09;静态顺序表 &#xff08;2.2&#xff09;动态顺序表 三、动态顺序表的实现 &#xff08;3.1&#xff09;基本结构定义 &#xff08;3.2&#xff09;初始化和销毁 &#xff08;3.2.1&#xff0…

【MWORKS专业工具箱系列教程】控制系列工具箱第四期:时域分析

本工具箱教程以控制系统模型创建、分析与设计流程为主线&#xff0c;通过大量示例介绍MWORKS控制系统工具箱的功能和具体使用。共计10篇文章&#xff0c;上一篇主要介绍了控制系统连接与化简。 同元软控&#xff1a;【MWORKS专业工具箱系列教程】控制系 列工具箱第三期&#x…

Shopline对接需要注意的问题

Shopline对接是一项复杂而细致的工作&#xff0c;为了确保对接的顺利进行&#xff0c;并保证系统的稳定性和可靠性&#xff0c;需要注意以下几个方面。 1.API文档的详细阅读 功能理解&#xff1a; 仔细阅读Shopline提供的API文档&#xff0c;全面了解每个接口的功能、参数、返…