Open yankewei opened 2 years ago
典型的使用栈数据结构可以解决的问题 有两点需要注意
class Solution {
/**
* @param Integer $n
* @param String[] $logs
* @return Integer[]
*/
function exclusiveTime($n, $logs) {
$arr = array_fill(0, $n, 0);
$queue = [];
foreach ($logs as $log) {
/** @var array{0:string,1:string,2:string} $function_info */
$function_info = explode(':', $log);
if ($queue === []) {
$queue[] = $function_info;
} else {
//获取队列中最后一个函数执行日志
$end_in_queue = $queue[count($queue)-1];
if ($function_info[1] === 'start') {
// 这里处理上边说到的第一个注意事项,要把函数1开始执行到函数2开始执行这一段时间算到函数1中
$arr[intval($end_in_queue[0])] += intval($function_info[2]) - intval($end_in_queue[2]);
$queue[] = $function_info;
} else {
$pre = array_pop($queue);
if ($queue !== []) { // 这里处理第二个注意事项,当函数2结束后重新启动函数1,所以需要更新函数1的启动时间
$queue[count($queue)-1][2] = $function_info[2] + 1;
}
$arr[intval($pre[0])] += intval($function_info[2]) - intval($pre[2]) + 1;
}
}
}
return $arr;
}
}
有一个单线程 CPU正在运行一个含有
n
道函数的程序。每道函数都有一个位于0
和n-1
之间的唯一标识符。函数调用存储在一个 调用栈 上 :当一个函数调用开始时,它的标识符将会推入栈中。而当一个函数调用结束时,它的标识符将会从栈中弹出。标识符位于栈顶的函数是 当前正在执行的函数 。每当一个函数开始或者结束时,将会记录一条日志,包括函数标识符、是开始还是结束、以及相应的时间戳。
给你一个由日志组成的列表
logs
,其中logs[i]
表示第i
条日志消息,该消息是一个按"{function_id}:{"start" | "end"}:{timestamp}"
进行格式化的字符串。例如,"0:start:3"
意味着标识符为0
的函数调用在时间戳3
的起始开始执行;而"1:end:2"
意味着标识符为1
的函数调用在时间戳2
的末尾结束执行。注意,函数可以调用多次,可能存在递归调用 。函数的独占时间定义是在这个函数在程序所有函数调用中执行时间的总和,调用其他函数花费的时间不算该函数的独占时间。例如,如果一个函数被调用两次,一次调用执行 2 单位时间,另一次调用执行 1 单位时间,那么该函数的 独占时间 为
2 + 1 = 3
。以数组形式返回每个函数的独占时间,其中第
i
个下标对应的值表示标识符i
的函数的独占时间。示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/exclusive-time-of-functions 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。