队列--任务调度器
2019-12-22 本文已影响0人
暮想sun
给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
public static int taskScheduler(char[] tasks, int n) {
//存储26个字母对应出现次数
int[] data = new int[26];
for (char c: tasks) {
data[c - 'A']++;
}
//逆序队列
PriorityQueue<Integer> queue = new PriorityQueue<>(26, Collections.reverseOrder());
//出现过的数据加入到队列中
for (Integer i : data) {
if (i > 0) {
queue.add(i);
}
}
int time = 0;
while (!queue.isEmpty()){
//在n的时间范围内执行任务,将执行完成的任务-1. =0的任务不再执行。
int i = 0;
List<Integer> executedList = new ArrayList<>();
while (i<=n){
if(!queue.isEmpty()){
int num = queue.poll();
if(num > 1){
executedList.add(num -1);
}
}
//在i<=n时存在,此时队列没有数据,也就是轮空的情况,但是时间还是在继续
time ++;
if(queue.isEmpty() && executedList.size() ==0){
break;
}
i++;
}
//将还有执行次数的数据加入队列,继续执行
for (Integer e: executedList) {
queue.add(e);
}
}
return time;
}