华为OD机试 - 静态扫描(Python/JS/C/C++ 2024 E卷 100分)

news2024/9/29 11:12:43

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出:

  1. 文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币。
  2. 扫描报告的缓存成本和文件大小无关,每缓存一个报告需要M个金币。
  3. 扫描报告缓存后,后续再碰到该文件则不需要扫描成本,直接获取缓存结果。

给出源代码文件标识序列F和文件大小序列S,求解采用合理的缓存策略Q,最少需要的金币数。

二、输入描述

第一行为缓存一个报告金币数M,L <= M <= 100。

第二行为文件标识序列:F1,F2,F3,…,Fn。

第三行为文件大小序列:S1,S2,S3,…,Sn。

备注:

1 <= N <= 10000
1 <= Fi <= 1000
1 <= Si <= 10

三、输出描述

采用合理的缓存策略,需最少的金币数。

四、测试用例

测试用例1:

1、输入

5
1 2 2 1 3 4
1 1 1 1 1 1

2、输出

6

3、说明

文件1和文件2各出现2次,文件3和文件4各出现1次。

判断是否缓存:

文件1:M=5 vs (2-1)1=1 → 不缓存,成本 21=2
文件2:M=5 vs (2-1)1=1 → 不缓存,成本 21=2
文件3:出现1次,不缓存,成本 11=1
文件4:出现1次,不缓存,成本 1
1=1

总成本:2 + 2 + 1 + 1 = 6

测试用例2:

1、输入

5
2 2 2 2 2
3 3 3 3 3

2、输出

8

3、说明

文件2出现5次,大小为3。
判断是否缓存:
文件2:M=5 vs (5-1)*3=12 → 缓存,成本 3 + 5=8
总成本:8

五、解题思路

  1. 统计文件出现次数和大小
    • 使用两个哈希表(或字典)
    • fileFrequencyMap:记录每个文件ID出现的次数,fileSizeMap:记录每个文件ID对应的文件大小。
  2. 计算总成本
    • 遍历每个唯一的文件ID,对于每个文件,比较两种策略的成本:
      • 不缓存:每次扫描都需要支付文件大小的成本,总成本为 frequency * size。
      • 缓存:第一次扫描支付文件大小的成本和缓存成本 M,后续不需要再次支付扫描成本,总成本为 size + M。
    • 选择两种策略中成本较低的一种,累加到总成本中。
  3. 输出结果:
    • 输出计算得到的最小总金币成本。

对于每个文件,若 frequency * size 小于或等于 size + M,则不缓存,支付总扫描成本;否则,选择缓存,支付 size + M。

六、Python算法源码

# 导入所需模块
import sys

def calculate_total_cost(M, file_ids, file_sizes):
    """
    计算总扫描成本
    :param M: 缓存一个报告的金币数
    :param file_ids: 文件ID列表
    :param file_sizes: 文件大小列表
    :return: 最小总金币数
    """
    # 使用字典统计每个文件ID的出现次数
    file_frequency_map = {}
    # 使用字典记录每个文件ID对应的文件大小
    file_size_map = {}
    
    # 遍历所有文件,统计频率和记录大小
    for file_id, size in zip(file_ids, file_sizes):
        if file_id in file_frequency_map:
            file_frequency_map[file_id] += 1
        else:
            file_frequency_map[file_id] = 1
            file_size_map[file_id] = size
    
    total_cost = 0
    # 遍历每个唯一的文件ID,计算最小成本
    for file_id in file_frequency_map:
        frequency = file_frequency_map[file_id]
        size = file_size_map[file_id]
        # 不缓存的成本
        cost_without_cache = frequency * size
        # 缓存的成本
        cost_with_cache = size + M
        # 选择较小的成本
        total_cost += min(cost_without_cache, cost_with_cache)
    
    return total_cost

def main():
    # 读取标准输入的所有行
    lines = sys.stdin.read().splitlines()
    # 去除可能的空行
    lines = [line.strip() for line in lines if line.strip()]
    
    # 读取缓存成本M
    M = int(lines[0])
    
    # 读取文件ID列表
    file_ids = list(map(int, lines[1].split()))
    
    # 读取文件大小列表
    file_sizes = list(map(int, lines[2].split()))
    
    # 计算总成本
    total_cost = calculate_total_cost(M, file_ids, file_sizes)
    
    # 输出结果
    print(total_cost)

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 === 3) {
        rl.close();
    }
});

rl.on('close', () => {
    // 读取缓存成本M
    const M = parseInt(inputLines[0]);

    // 读取文件ID列表
    const fileIds = inputLines[1].split(' ').map(Number);

    // 读取文件大小列表
    const fileSizes = inputLines[2].split(' ').map(Number);

    // 计算总成本
    const totalCost = calculateTotalCost(M, fileIds, fileSizes);

    // 输出结果
    console.log(totalCost);
});

/**
 * 计算总扫描成本
 * @param {number} M 缓存一个报告的金币数
 * @param {number[]} fileIds 文件ID数组
 * @param {number[]} fileSizes 文件大小数组
 * @returns {number} 最小总金币数
 */
function calculateTotalCost(M, fileIds, fileSizes) {
    // 使用对象统计每个文件ID的出现次数
    const fileFrequencyMap = {};
    // 使用对象记录每个文件ID对应的文件大小
    const fileSizeMap = {};

    // 遍历所有文件,统计频率和记录大小
    for (let i = 0; i < fileIds.length; i++) {
        const fileId = fileIds[i];
        const size = fileSizes[i];
        if (fileFrequencyMap.hasOwnProperty(fileId)) {
            fileFrequencyMap[fileId] += 1;
        } else {
            fileFrequencyMap[fileId] = 1;
            fileSizeMap[fileId] = size;
        }
    }

    let totalCost = 0;
    // 遍历每个唯一的文件ID,计算最小成本
    for (const fileId in fileFrequencyMap) {
        const frequency = fileFrequencyMap[fileId];
        const size = fileSizeMap[fileId];
        const costWithoutCache = frequency * size;
        const costWithCache = size + M;
        totalCost += Math.min(costWithoutCache, costWithCache);
    }

    return totalCost;
}

八、C算法源码

#include <stdio.h>
#include <stdlib.h>

// 定义最大文件ID范围
#define MAX_FILE_ID 1001

int main() {
    int M;
    // 读取缓存成本M
    scanf("%d", &M);
    
    // 定义数组存储文件ID和文件大小
    int fileIds[10000];
    int fileSizes[10000];
    
    int count = 0;
    // 读取文件ID,直到换行或文件大小输入开始
    while (scanf("%d", &fileIds[count]) != EOF) {
        count++;
        // 假设文件大小与文件ID数量相同
        if (count >= 10000) break;
    }
    
    // 重新定位输入流到读取文件大小
    // 假设输入格式正确,文件大小紧跟文件ID之后
    // 重新读取文件大小
    for (int i = 0; i < count; i++) {
        scanf("%d", &fileSizes[i]);
    }
    
    // 使用数组统计文件频率,文件大小
    int fileFrequencyMap[MAX_FILE_ID] = {0};
    int fileSizeMap[MAX_FILE_ID] = {0};
    
    for (int i = 0; i < count; i++) {
        int fileId = fileIds[i];
        int size = fileSizes[i];
        fileFrequencyMap[fileId]++;
        if (fileFrequencyMap[fileId] == 1) {
            fileSizeMap[fileId] = size;
        }
    }
    
    long long totalCost = 0;
    // 遍历所有可能的文件ID,计算成本
    for (int fileId = 0; fileId < MAX_FILE_ID; fileId++) {
        if (fileFrequencyMap[fileId] > 0) {
            int frequency = fileFrequencyMap[fileId];
            int size = fileSizeMap[fileId];
            long long costWithoutCache = (long long)frequency * size;
            long long costWithCache = (long long)size + M;
            // 选择较小的成本
            if (costWithoutCache <= costWithCache) {
                totalCost += costWithoutCache;
            } else {
                totalCost += costWithCache;
            }
        }
    }
    
    // 输出结果
    printf("%lld\n", totalCost);
    
    return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int M;
    // 读取缓存成本M
    cin >> M;
    
    // 读取文件ID序列
    vector<int> fileIds;
    string line;
    // 读取文件ID
    while(cin.peek() != '\n' && !cin.eof()){
        int id;
        cin >> id;
        fileIds.push_back(id);
    }
    // 读取换行符
    getline(cin, line);
    
    // 读取文件大小序列
    vector<int> fileSizes;
    while(cin >> ws && !cin.eof()){
        int size;
        cin >> size;
        fileSizes.push_back(size);
    }
    
    // 使用unordered_map统计频率和记录大小
    unordered_map<int, int> fileFrequencyMap;
    unordered_map<int, int> fileSizeMap;
    
    for(int i=0; i<fileIds.size(); i++){
        int fileId = fileIds[i];
        int size = fileSizes[i];
        fileFrequencyMap[fileId]++;
        if(fileFrequencyMap[fileId] == 1){
            fileSizeMap[fileId] = size;
        }
    }
    
    long long totalCost = 0;
    // 遍历每个文件,计算最小成本
    for(auto &entry: fileFrequencyMap){
        int fileId = entry.first;
        int frequency = entry.second;
        int size = fileSizeMap[fileId];
        long long costWithoutCache = (long long)frequency * size;
        long long costWithCache = (long long)size + M;
        totalCost += min(costWithoutCache, costWithCache);
    }
    
    // 输出结果
    cout << totalCost << "\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/2176519.html

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

相关文章

jenkins 构建报错ERROR: Error fetching remote repo ‘origin‘

问题描述 修改项目的仓库地址后&#xff0c;使用jenkins构建报错 Running as SYSTEM Building in workspace /var/jenkins_home/workspace/【测试】客户端/client-fonchain-main The recommended git tool is: NONE using credential 680a5841-cfa5-4d8a-bb38-977f796c26dd&g…

深圳数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

深圳正以前所未有的速度和力度&#xff0c;推进着数字经济与实体经济深度融合的新篇章。数字孪生工业互联网可视化技术作为关键驱动力&#xff0c;赋能新型工业化智能制造工厂&#xff0c;引领着深圳乃至全国制造业的转型升级。从精密制造到重型装备&#xff0c;从汽车电池到医…

喜讯!宝兰德荣获第三届“鼎新杯”数字化转型应用大赛二等奖

9月24日-25日&#xff0c;“2024数字化转型发展大会”在北京成功举办。来自政产学研用的专家学者、知名企业代表同台论道&#xff0c;共话数字化转型的新趋势。大会期间&#xff0c;备受瞩目的第三届“鼎新杯”数字化应用转型大赛结果正式揭晓&#xff0c;「宝兰德中间件统一管…

[240929] 12 款最佳免费开源隐写工具 | Llama 3.2: 开源、可定制模型,革新边缘人工智能和视觉体验

目录 12 款最佳免费开源隐写工具Llama 3.2: 开源、可定制模型&#xff0c;革新边缘人工智能和视觉体验 12 款最佳免费开源隐写工具 什么是隐写术&#xff1f; 隐写术是一种将信息隐藏在其他信息中的艺术和科学&#xff0c;除了发送者和预期的接收者之外&#xff0c;没有人会怀…

Agilent安捷伦N1914A双通道数字功率计操作说明

Agilent安捷伦N1914A双通道数字功率计操作说明 Keysight / Agilent N1914A EPM 系列双通道平均功率计 N1914A EPM 系列功率计为工作台/机架和现场应用提供可重复且可靠的结果。N1914A 提供高达 400 个读数/秒的测量速度&#xff0c;可实现快速、准确的平均功率测量&#xff0…

帮儿女带孩子的老人,都有以下几种共性

在现代社会中&#xff0c;随着生活节奏的加快&#xff0c;许多年轻父母需要在繁忙的工作中平衡家庭和事业&#xff0c;老人们自然成为了带孙辈的重要力量。 放眼望去&#xff0c;不少家庭的老人主动承担起了带孙子的责任&#xff0c;为子女分担了育儿的重担。 随着时代的变化…

低功耗4G模组Air780E的串口通信指南

今天我们来讲解低功耗4G模组Air780E的串口通信的基本用法&#xff0c;合宙的小伙伴们&#xff0c;学起来吧&#xff01; 一、硬件准备 780E开发板一套&#xff0c;包括天线、USB数据线。 USB转TTL工具或线&#xff08;例如ch340、ft232&#xff09; PC电脑&#xff0c;串口…

计算机考证汇总-第一期-CCF认证类

一、前言 我发现在博客文章中对于&#xff0c;计算机专业相关从业人员、学生等群体&#xff0c;并没有很详细的记录考证的信息&#xff0c;我在此便将部分证书按照个人理解简单归纳整理一下&#xff0c;有不足之处还望友好交流&#xff0c;大多数资料取自官网、相关博客及个人…

示波器带宽和测量的关系

示波器的带宽指的是-3db带宽&#xff0c;比如100MHZ带宽的示波器&#xff0c;用它测量幅度是1V&#xff0c;频率是100Mhz的正弦波&#xff0c;示波器测量值会下降到0.707V&#xff0c; 高于示波器带宽的信号会变小&#xff0c;下图是示例。一些波形也会失真。 100M带宽示波器的…

二次记录服务器被(logrotate)木马入侵事件

现象&#xff1a;SSH失败、CPU满转 服务器ssh登录不上&#xff0c;一直处于登录中状态。 于是进入云服务器控制台&#xff0c;CPU打满状态&#xff0c;知道服务器被攻击了 腾讯云入侵检测&#xff0c;高危命令报警 排查过程 尝试 VNC 登录 由于SSH登录不上&#xff0c;进入云…

WPS使用越来越卡顿

UOS统信wps频繁的使用后出现卡顿问题&#xff0c;通过删除或重命名kingsoft文件缓存目录。 文章目录 一、问题描述二、问题原因三、解决方案步骤一步骤二步骤三 一、问题描述 用户在频繁的使用wps处理工作&#xff0c;在使用一段时间后&#xff0c;用户反馈wps打开速度慢&…

繁体字能申请注册商标吗?

有些主体为了表现企业历史和文化&#xff0c;喜欢用繁体字申请注册商标&#xff0c;那繁体字可以能申请注册商标吗&#xff0c;当然是可以的&#xff0c;普推知产老杨检索在1990年《国家工商行政管理局商标局关于商标可否使用繁体字问题的答复》&#xff0c;可以使用繁体字&…

【经验技巧】如何做好S参数的仿测一致性

根据个人经验,想要做好电路板S参数的仿测一致性,如下的相关信息必须被认真对待: 1. PCB叠构(Stack up),仿真模型需要保证设计参数与板厂供应商的生产参数完全一样,这些参数包括: 叠层结构数据;介电常数;损耗因子;蚀刻因子;表面粗糙度。 2. 仿真中,需要保证信号测试…

基于TRIZ理论的创新设计流程是怎样的?

TRIZ&#xff08;TheoryofInventiveProblemSolving&#xff09;&#xff0c;即发明问题解决理论&#xff0c;是一套基于知识的、面向设计者的系统化创新方法学。Altshuller通过对数百万份专利文献的研究&#xff0c;发现了技术问题解决过程中的普遍模式和规律&#xff0c;从而建…

World of Warcraft [CLASSIC][80][Alonsus][Dark Iron Legacy]

World of Warcraft [CLASSIC][80][Alonsus][Dark Iron Legacy] [任务][黑铁的遗产] [黑石深渊][路线图][手把手][小白教程] Dark Iron Legacy - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 副本门口进来 直走 直走 直走 第一个路口左…

tee命令:轻松同步输出到屏幕与文件

一、命令简介 ​tee​ 命令在 Linux 和 Unix 系统中用于读取标准输入的数据&#xff0c;并将其同时输出到标准输出和文件中。简单来说&#xff0c;tee​ 命令可以用来分割数据流&#xff0c;使其既能够被输出到屏幕&#xff0c;也能够被写入到文件中。 ​​ ‍ 二、命令参数…

基于Java的停车场管理微信小程序 停车场预约系统【源码+文档+讲解】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、停车场管理微…

电子相册|智能化电子相册|基于java的电子相册管理系统设计与实现(源码+数据库+文档)

电子相册管理系统 目录 基于java的电子相册管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

.NetCore 8 SwaggerGen 显示接口注析

先看一下效果 从图上看到了没 Swagger 那里显示出了 代码里的注析。 要在Swagger 外面显示出代码里的注析也不难 1.先在项目里 属性-》生成-》输出-》然后 把“生成包含API文档的文件” 打上勾。如图最后 在Program.cs 里把 addSwagger 那一块改成 builder.Services.AddSw…

企业间图文档发放:如何在保障安全的同时提升效率?

不管是大型企业&#xff0c;还是小型创业公司&#xff0c;不论企业规模大小&#xff0c;每天都会有大量的图文档发放&#xff0c;对内传输协作和对外发送使用&#xff0c;数据的生产也是企业业务生产力的体现之一。 伴随着业务范围的不断扩大&#xff0c;企业与客户、合作伙伴之…