队列--任务调度器

作者: 暮想sun | 来源:发表于2019-12-22 11:35 被阅读0次

    给定一个用字符数组表示的 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;
    
        }
    
    

    相关文章

      网友评论

        本文标题:队列--任务调度器

        本文链接:https://www.haomeiwen.com/subject/ckdunctx.html