队列--任务调度器

作者: 暮想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;

    }

相关文章

  • 队列--任务调度器

    给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的...

  • 8.7 阻塞队列BlockingQueue

    简介 当调度器调度线程池执行任务时,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入...

  • Ios面试复习--多线程(GCD)

    中枢调度器 多核并行运算解决方案 两个核心概念 任务 和 队列 其中队列存放任务 任务的取出遵循队列的先进先出,后...

  • YARN REST API

    先附官网地址 查看指定队列的所有任务: 查看指定任务的详细信息: 监控任务: 杀死任务: 查询集群调度器详情(包含...

  • GCD死锁的知识点

    队列:负责调度任务 串行队列(Serial Dispatch Queue):一个接一个的调度任务,要等待上一个执行...

  • iOS调度队列

    GCD调度队列是执行任务的强大工具。调度队列允许您相对于调度者异步或者同步的执行任意代码块。您能够使用调度队列来执...

  • Golang实现简单爬虫框架(5)——项目重构与数据存储

    前言 在上一篇文章《Golang实现简单爬虫框架(4)——队列实现并发任务调度》中,我们使用用队列实现了任务调度,...

  • 当同步和异步遇到主队列

    主队列:只要队列中有任务,就会安排任务到主线程中执行。但是如若主队列发现主线程在执行任务,那么主队列会暂停调度队列...

  • JavaScript事件循环

    Tasks(任务),microtasks(微任务),queues(队列),schedules(调度): 举个例子:...

  • CGD基本介绍(三)

    GCD:Grand Central Dispatch(牛逼的中枢调度器) GCD两个重要的概念:任务、队列 创建C...

网友评论

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

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