Loading

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;
    }
}
posted @ 2020-10-24 11:51  上海井盖王  阅读(87)  评论(0)    收藏  举报