华为OD机试最后一题

华为OD机试最后一题

题目

前几天考了华为OD机试,最后一题是关于任务规划的,当时没做出来。上网搜了下发现和leetcode621差不多。

leetcode 621

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的 最短时间 。

我一开始没思路,看了评论里有个大神的题解,讲的很清楚。

题解

思路

题目意思是给出任务数组task[],相同的任务冷却时间是n,不同的任务冷却时间是1。安排最短时间完成任务。

核心思路:找到出现次数最多的任务,将他们先放好,然后他们之间的间隔是n,在间隔里插入其他任务。


1.先找出序列里出现次数最多的序列,次数为count,花费的时间最少是minTime=(count-1)*(n+1)+1;

2.找出现次数第二多的序列,如果出现的次数也是count,则minTime+1;

3.继续插入直至所有把空格都插完。

4.如果空格都插完后,还有多余的任务。那么想象一下,只要把他们随机插入进去就可以了。因为空格代表的是最短冷却时间,当把空格都填满后,再插入的话一定满足大于冷却时间的要求。这时候答案是task.length。


当空格没填满时,答案是minTime,且其一定大于task.length。

当空格填满时,答案是task.length,且其一定大于minTime。

综上所述,答案一定是二者中最大的。

代码

编写思路

public int leastInterval(char[] task, int n) {
        //按照任务出现次数排序,找到最大的次数count
        //minTime=(count-1)*(n+1)
        //如果别的的任务序列次数=count,则minTime+1
        //答案是max(minTime,task.length)
    }

完整代码

public int leastInterval(char[] tasks, int n) {
        //按照任务出现次数排序,找到最大的次数count
        int[] bucket=new int [26];
        for (int i = 0; i < tasks.length; i++) {
            bucket[tasks[i]-'A']++;
        }
        Arrays.sort(bucket);
        int count=bucket[25];
        //minTime=(count-1)*(n+1)
        int minTime=(count-1)*(n+1)+1;
       
        //如果别的的任务序列次数=count,则minTime+1
        for (int i = 24; i >=1 ; i--) {
            if(bucket[i]==count){
                minTime++;
            }else{
                break;
            }
        }
        //答案是max(minTime,task.length)
        return Math.max(minTime,tasks.length);
    }

执行结果

运行结果

原题

Leetcode 621

posted @ 2022-08-06 23:03  东流y  阅读(354)  评论(0)    收藏  举报