函数的独占时间
记录每个函数所运行的时间长度,输入例子 ["0:start:0","1:start:2","1:end:5","0:end:6"]
解题代码
思路:可以用栈进行记录每一个编号id,start入栈,end出栈,获取区间值,使用下一个节点 减去前一个节点的起始点就是前半段区间,后半段区间使用前一个节点结束点范围减去当前点节点结束位置
- ["0:start:0","1:start:2","1:end:5","0:end:6"]
- [0(start),1,2(start),3,4,5(end),6(end)]
- id = 0前半段(2 - 0) 后半段(6 - 5),id = 1没有子任务,直接计算区间即可(5 - 2 + 1)
- 最后结果为 [3, 4]
var exclusiveTime = function(n, logs) {
let ans = new Array(n).fill(0);
let stack = []; // 记录任务id的栈
let pre = 0; // 记录前一个时长
for (let i = 0; i < logs.length; i++) {
const element = logs[i];
const pos = element.split(":");
let [id, status, time] = pos;
time = Number(time);
if (status === "start") { // 任务开始
if (stack.length) {
ans[stack[stack.length - 1]] += time - pre; // 将栈顶编号的时间段记录
}
pre = time;
stack.push(id);
} else { // 任务结束
ans[id] += time - pre + 1; // 如果是任务结束应该把当前id的起始时间区间 + 现在结束到pre之前的时间区间
pre = time + 1; // 因为pre计算时 + 1 ,所以这里也要 + 1 下次循环计算时才是正确的值,否则就会出现(time = 6, pre = 5,time - pre + 1 = 2)而实际结果应该是 6 - 5 = 1 -> 6 - 6 + 1 = 1
stack.pop(); // 处理完一个任务,当前任务出栈即可
}
}
return ans; // 返回结果数组即可
};