这个题目比较长,看了好几遍才明白,还是老规矩,先看船长在看着助教,觉得船长的思路好理解,所以就继续看了题解,按照船长的思路有一个,看着尝试理解这写了一遍,中间有些不太明白,暂且记录吧
/**
* @param {number} n
* @param {string[]} logs
* @return {number[]}
*/
var exclusiveTime = function (n, logs) {
// 记录独占时间 开始设置都为0
let ret = new Array(n).fill(0);
// 用栈 记录在执行的程序
let stack = [];
// 前一个状态的位置
let pre = 0;
for (const item of logs) {
let [idStr, status, timeStr] = item.split(':');
if (status === 'start') {
// 如果是start 则把时间算给上一个函数
// 这里判断stack有值 说明之前有函数运行过一段时间 但是还没有结束
if (stack.length) {
// 这一步会把timeStr 强制转换为数字 所以ret里面存放的 都是数字
ret[stack[stack.length - 1]] += timeStr - pre;
}
pre = timeStr;
stack.push(idStr);
} else {
//如果是end把之前的时间加到当前函数中
// ?? ret[idStr] 和之前 ret[stack[stack.length - 1]] 类似? 根据idStr这样就能找到是正在运行的函数?
ret[idStr] += timeStr - pre + 1; // 5 -2 +1
pre = Number(timeStr) + 1; // ?? 这个需要转 上面的为啥不用转了
stack.pop();
}
}
return ret;
};