一、题目描述
有 5 台打印机打印文件,每台打印机有自己的待打印队列。
因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。
打印机会从自己的待打印队列中选择优先级最高的文件来打印。
如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。
现在请你来模拟这5台打印机的打印过程。
二、输入描述
每个输入包含 1 个测试用例,每个测试用例第 1 行给出发生事件的数量N(0<N<1000)。
接下来有 N 行,分别表示发生的事件。
共有如下两种事件:
- IN P NUM,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0<P≤5,0<NUM≤10);
- OUT P,表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0<P≤5)。
三、输出描述
对于每个测试用例,每次OUT P事件,请在一行中输出文件的编号。
如果此时没有文件可以打印,请输出NULL。
文件的编号定义为:IN P NUM事件发生第 X 次,此处待打印文件的编号为 X。编号从1开始。
四、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);
}
}
}
}
五、效果展示
1、输入
5
IN 1 2
IN 1 3
IN 1 2
IN 1 3
OUT 1
2、输出
2
3、说明
- map放置打印任务 key:打印机的编号,value:type集合
- 如果strs[0] == IN,存入map
- 如果strs[0] == OUT,判断打印机是否存在打印任务
- 如果存在,求出打印机的打印任务,取出第一个元素
- 如果不存在打印任务,输出NULL
🏆下一篇:华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。