✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 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(" ");// 存入mapif (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]);// 如果不存在打印任务,输出NULLif (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)
。