华为OD机试真题 JavaScript 实现【静态代码扫描服务】【2023Q1 100分】

在这里插入图片描述

一、题目描述

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

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

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

二、输入描述

第一行为缓存一个报告金币数M,1<=M<=100
第二行为文件标识序列: F1,F2,F3…Fn,其中 1<=N<=10000, 1<=Fi<=1000
第三行为文件大小序列: s1,s2,s3…sn,其中 1<=N<=10000, 1<=Si<=10

三、输出描述

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

四、解题思路

  1. 首先读取输入的缓存一个报告金币数 M;
  2. 使用 nextLine() 方法分别读取文件标识序列和文件大小序列,并将它们分别存储在字符串数组 arr1 和 arr2 中;
  3. 创建一个 Map 来存储文件标识和对应的文件大小和出现次数;
  4. 使用循环遍历文件标识序列,对每个文件标识进行以下操作:
    • 将文件标识和文件大小分别转换为整数类型;
    • 从 map 中获取当前文件标识的记录,如果不存在则创建一个新记录;
    • 将文件大小累加到记录中的文件大小上,并将出现次数加一;
    • 将更新后的记录存回 map 中;
  5. 初始化变量 sum 为 0,用于存储最少需要的金币数;
  6. 使用循环遍历 map中的每个记录,对每个记录进行以下操作:
    • 获取文件大小和出现次数;
    • 计算如果不使用缓存的情况下所需金币数(文件大小乘以出现次数);
    • 计算如果使用缓存的情况下所需金币数(文件大小加上缓存金币数);
    • 取两者中的较小值,并累加到 sum 中;
  7. 输出 sum,即为采用合理的缓存策略所需的最少金币数;

五、JavaScript算法源码

function minimumCoins(M, input1, input2) {
    const fileIdentifiers = input1.split(" ")
    const fileSizes = input2.split(" ")
    const map = new Map();
    for (let i = 0; i < fileIdentifiers.length; i++) {
        const key = parseInt(fileIdentifiers[i]);
        const coin = parseInt(fileSizes[i]);

        if (map.has(key)) {
            const arr = map.get(key);
            arr[0] += coin;
            arr[1]++;
        } else {
            map.set(key, [coin, 1]);
        }
    }

    let sum = 0;
    for (const [key, [coin, count]] of map.entries()) {
        const temp1 = coin * count;
        const temp2 = coin + M;
        const val = Math.min(temp1, temp2);
        sum += val;
    }

    return sum;
}

六、效果展示

1、输入

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

2、输出

7

华为OD机试真题 JavaScript 实现【静态代码扫描服务】【2023Q1 100分】_第1张图片


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,java,华为,学习)