✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
有 5 台打印机打印文件,每台打印机有自己的待打印队列。
因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。
打印机会从自己的待打印队列中选择优先级最高的文件来打印。
如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。
现在请你来模拟这5台打印机的打印过程。
2. 输入描述
每个输入包含 1 个测试用例,每个测试用例第 1 行给出发生事件的数量N(0<N<1000)。
接下来有 N 行,分别表示发生的事件。
共有如下两种事件:
IN P NUM,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0<P≤5,0<NUM≤10);
OUT P,表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0<P≤5)。
3. 输出描述
对于每个测试用例,每次OUT P事件,请在一行中输出文件的编号。
如果此时没有文件可以打印,请输出NULL。
文件的编号定义为:IN P NUM事件发生第 X 次,此处待打印文件的编号为 X。编号从1开始。
4. Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
// 放置打印任务 key:打印机的编号,value:type集合
Map<String, List<int[]>> map = new HashMap<>();
int count = 0;
for (int i = 0; i < n; i++) {
String[] strs = sc.nextLine().split(" ");
// 存入map
if (strs[0].equals("IN")) {
int[] inInts = new int[2];
inInts[0] = Integer.parseInt(strs[2]);
inInts[1] = ++count;
List<int[]> inList = new ArrayList<>();
if (map.containsKey(strs[1])) {
inList = map.get(strs[1]);
inList.add(inInts);
} else {
inList.add(inInts);
}
map.put(strs[1], inList);
// 判断打印机是否存在打印任务
} else if (strs[0].equals("OUT")) {
if (!map.containsKey(strs[1])) {
System.out.println("NULL");
continue;
}
// 如果存在,求出打印机的打印任务
List<int[]> outList = map.get(strs[1]);
// 如果不存在打印任务,输出NULL
if (outList.size() == 0) {
System.out.println("NULL");
} else {
outList.sort((a, b) -> {
return b[0] - a[0];
});
System.out.println(outList.get(0)[1]);
// 取出第一个元素
outList.remove(0);
}
}
}
}
5. 测试
6.解题思路
- 读取输入的测试用例数量N。
- 创建一个HashMap,用于存储每个打印机的待打印队列。键是打印机的编号,值是一个包含文件信息的列表。列表中的每个元素是一个整型数组,包含两个元素:文件的优先级和文件的编号。
- 使用一个计数器count,用于记录文件的编号。
- 循环N次,处理每个事件:
- 读取一行输入,将其分割为事件类型和相关参数。
- 如果事件类型是"IN",表示有一个文件放入了待打印队列。将文件的优先级和编号存储到列表中,并将列表存储到HashMap中对应打印机的键值对中。
- 如果事件类型是"OUT",表示打印机进行了一次文件打印。首先检查待打印队列是否为空,如果为空则输出"NULL"。否则,获取待打印队列中优先级最高的文件(优先级最大且编号最小)。输出该文件的编号,并从待打印队列中移除该文件。
- 完成所有事件处理后,结束程序。
该算法的时间复杂度为O(NlogM)
,其中N是事件数量,M
是待打印队列中文件的平均数量。每次处理OUT
事件时,需要对待打印队列中的文件按优先级进行排序,时间复杂度为O(MlogM)
。最终的空间复杂度取决于待打印队列中文件的总数量,即O(M)
。