✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出:
- 文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币;
- 扫描报告的缓存成本和文件大小无关,每缓存一个报告需要M个金币;
- 扫描报告缓存后,后继再碰到该文件则不需要扫描成本,直接获取缓存结果
给出源代码文件标识序列和文件大小序列,求解采用合理的缓存策略,最少需要的金币数。
2. 输入描述
第一行为缓存一个报告金币数M,1<=M<=100
第二行为文件标识序列: F1,F2,F3…Fn,其中 1<=N<=10000, 1<=Fi<=1000
第三行为文件大小序列: s1,s2,s3…sn,其中 1<=N<=10000, 1<=Si<=10
3. 输出描述
采用合理的缓存策略,需要的最少金币数。
4. Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int a = Integer.parseInt(line);
String line1 = sc.nextLine();
String line2 = sc.nextLine();
String[] arr1 = line1.split(" ");
String[] arr2 = line2.split(" ");
Map<Integer, int[]> map = new HashMap<>();
for (int i = 0; i < arr1.length; i++) {
int key = Integer.parseInt(arr1[i]);
int coin = Integer.parseInt(arr2[i]);
int[] arr = map.getOrDefault(key, new int[]{0, 0});
arr[0] = coin;
arr[1]++;
map.put(key, arr);
}
int sum = 0;
for (int key : map.keySet()) {
int[] arr = map.get(key);
int coin = arr[0];
int temp1 = coin * arr[1];
int temp2 = coin + a;
int val = Math.min(temp1, temp2);
sum += val;
}
System.out.println(sum);
}
5. 测试
6.解题思路
- 首先读取输入的缓存一个报告金币数
M
。 - 使用
nextLine()
方法分别读取文件标识序列和文件大小序列,并将它们分别存储在字符串数组arr1
和arr2
中。 - 创建一个
Map<Integer, int[]>
来存储文件标识和对应的文件大小和出现次数。 - 使用循环遍历文件标识序列,对每个文件标识进行以下操作:
- 将文件标识和文件大小分别转换为整数类型。
- 从
map
中获取当前文件标识的记录,如果不存在则创建一个新记录。 - 将文件大小累加到记录中的文件大小上,并将出现次数加一。
- 将更新后的记录存回
map
中。
- 初始化变量
sum
为 0,用于存储最少需要的金币数。 - 使用循环遍历 map中的每个记录,对每个记录进行以下操作:
- 获取文件大小和出现次数。
- 计算如果不使用缓存的情况下所需金币数(文件大小乘以出现次数)。
- 计算如果使用缓存的情况下所需金币数(文件大小加上缓存金币数)。
- 取两者中的较小值,并累加到
sum
中。
- 输出
sum
,即为采用合理的缓存策略所需的最少金币数。