前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。
靡不有初,鲜克有终,加油坚持下去。
问题:
共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。
给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] :
idi 是处理第 i 个任务的员工的 id ,且 leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。 注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。
返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。
示例:
输入:n = 10, logs = [[0,3],[2,5],[0,9],[1,15]]
输出:1
解释:
任务 0 于时刻 0 开始,且在时刻 3 结束,共计 3 个单位时间。
任务 1 于时刻 3 开始,且在时刻 5 结束,共计 2 个单位时间。
任务 2 于时刻 5 开始,且在时刻 9 结束,共计 4 个单位时间。
任务 3 于时刻 9 开始,且在时刻 15 结束,共计 6 个单位时间。
时间最长的任务是任务 3 ,而 id 为 1 的员工是处理此任务的员工,所以返回 1 。
思路:看了这个题目,理解起来不难,就是这题目是越来越长了,看了有点费脑细胞。我手动模拟一下,很好理解,但是转换成代码的时候,有点难,我就看了评论区,思考了一下,就得出了思路,就是for循环遍历,先获取每次任务的耗时,存于数组arr,然后使用map()把每种耗时及每种耗时对应的员工作为键值对存储起来,找到最高耗时,然后获得对应的所有员工,得到其中最小的id就是所求的员工。
基于上述思考,代码如下:
var hardestWorker = function(n, logs) {
//存储每个任务的耗时
let arr = []
let maxTime = 0
//第一次任务的耗时
arr.push(logs[0][1] - 0);
//获取后续所有任务的耗时
for (let i = 0; i < logs.length - 1; i++) {
let time = logs[i + 1][1] - logs[i][1];
arr.push(time);
}
let map = new Map()
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])) {
map.set(arr[i], [logs[i][0]])
} else {
map.set(arr[i], [...map.get(arr[i]), logs[if][0]])
}
}
//找出最大耗时
maxTime = Math.max(...arr);
//获取到用时最长的所有员工的id,工号最小的id
return map.get(maxTime).sort((a, b) => a - b)[0]
};
执行结果如下图:
结论:明天加油