解题思路
-
创建长度为
n的数组res维护返回值,一个栈维护函数的调用栈 -
遍历输入的
logs,如果当前日志为开始日志,将该函数的开始时间戳压入栈 -
如果当前日志为结束日志,则栈顶值记录的是它的开始时间戳,弹出栈顶值,将该函数的运行时间加上本次运行时间(结束时间戳-开始时间戳+1)
-
将栈中的其他函数的开始时间戳加上本次函数的运行时间,达到对应函数的运行时间减去该函数运行时间的目的
-
当输入
logs遍历完成后,res数组就记录了每个函数的独占时间,返回res即可
var exclusiveTime = function(n, logs) {
// 初始化结果数组
const res = Array(n).fill(0),
// 函数调用栈
stack = [];
// 遍历日志
for(let i = 0;i<logs.length;i++){
let [ind,status,time] = logs[i].split(':');
ind *= 1;
time *= 1;
// 如果为开始日志,将函数开始时间戳压入栈
if(status==='start') stack.push(time)
else {
// 计算函数本次于行时间
const num = time-stack.pop()+1
res[ind] += num
// 处理栈中函数的开始时间戳
handleStack(num)
}
}
return res;
// 处理栈中函数开始时间戳,达到对应函数运行时间减去本次函数运行时间的目的
function handleStack(num){
for(let i =0;i<stack.length;i++){
stack[i]+=num;
}
}
};