[636] 函数的独占时间(31)

71 阅读1分钟

这个题目比较长,看了好几遍才明白,还是老规矩,先看船长在看着助教,觉得船长的思路好理解,所以就继续看了题解,按照船长的思路有一个,看着尝试理解这写了一遍,中间有些不太明白,暂且记录吧

/**
 * @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;
};