636. [栈]函数的独占时间
636. 函数的独占时间
使用栈来模拟函数的调用,即在遇到一条包含 start 的日志时,我们将对应的函数 id 入栈;在遇到一条包含 end 的日志时,我们将对应的函数 id 出栈。在每一个时刻,栈中的所有函数均为被调用的函数,而栈顶的函数为正在执行的函数。
依次遍历所有的日志,对于第 i 条日志,如果它包含 start,那么栈顶函数从其时间戳 time[i] 开始运行,即 prev = time[i];如果它包含 end,那么栈顶函数从其时间戳 time[i] 的下一个时间开始运行,即 prev = time[i] + 1。对于第 i + 1 条日志,如果它包含 start,那么在时间戳 time[i + 1] 时,有新的函数被调用,因此原来的栈顶函数的独占时间为 time[i + 1] - prev;如果它包含 end,那么在时间戳 time[i + 1] 时,原来的栈顶函数执行结束,独占时间为 time[i + 1] - prev + 1。在这之后,我们更新 prev 并遍历第i + 2 条日志。在遍历结束后,我们就可以得到所有函数的独占时间。
class Solution {
public int[] exclusiveTime(int n, List<String> logs) {
int[] res = new int[n];
Stack<Integer> stack = new Stack<>();
String[] s = logs.get(0).split(":");
stack.push(Integer.parseInt(s[0]));
int i = 1;
int prev = Integer.parseInt(s[2]);
while (i < logs.size()){
s = logs.get(i).split(":");
if (s[1].equals("start")) {
if (!stack.isEmpty()) {
res[stack.peek()] += Integer.parseInt(s[2]) - prev;
}
stack.push(Integer.parseInt(s[0]));
prev = Integer.parseInt(s[2]);
} else {
res[stack.peek()] += Integer.parseInt(s[2]) - prev + 1;
stack.pop();
prev = Integer.parseInt(s[2]) + 1;
}
i++;
}
return res;
}
}

浙公网安备 33010602011771号