数据结构与算法

队列--任务调度器

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;

    }

上一篇下一篇

猜你喜欢

热点阅读