华为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);
}
执行结果


浙公网安备 33010602011771号