636. Exclusive Time of Functions

博客围绕单线程CPU执行函数展开,介绍了函数日志格式,如“{function_id}:{“start” | “end”}:{timestamp}”,并定义了函数的独占时间。通过示例展示如何根据输入的日志计算每个函数的独占时间,还提到单CPU执行函数的规则。

题目

  计算函数执行时长。

On a single threaded CPU, we execute some functions. Each function has a unique id between 0 and N-1.

We store logs in timestamp order that describe when a function is entered or exited.

Each log is a string with this format: “{function_id}:{“start” | “end”}:{timestamp}”. For example, “0:start:3” means the function with id 0 started at the beginning of timestamp 3. “1: end :2” means the function with id 1 ended at the end of timestamp 2.

A function’s exclusive time is the number of units of time spent in this function. Note that this does not include any recursive calls to child functions.

Return the exclusive time of each function, sorted by their function id.

Example 1:

Input: n = 2 logs = [“0:start:0”,“1:start:2”,“1: end:5”,“0: end:6”]
Output: [3, 4]

Explanation:
Function 0 starts at the beginning of time 0, then it executes 2 units of time and reaches the end of time 1.
Now function 1 starts at the beginning of time 2, executes 4 units of time and ends at time 5.
Function 0 is running again at the beginning of time 6, and also ends at the end of time 6, thus executing for 1 unit of time.
So function 0 spends 2 + 1 = 3 units of total time executing, and function 1 spends 4 units of total time executing.

代码
单cpu执行某个函数,只能执行完了再返回上层函数。所以不会出现 0 start 1 start 0 end 1 end 这种测试样例。

class Solution {
   public int[] exclusiveTime(int n, List<String> logs) {
       
        int[] res = new int[n];
        Stack<Integer> stack = new Stack<>();
        int prevTime = 0;
       
        for (String log : logs) {
            
            String[] parts = log.split(":");
            
            if (!stack.isEmpty()) 
                res[stack.peek()] +=  Integer.parseInt(parts[2]) - prevTime; 
            
            prevTime = Integer.parseInt(parts[2]);
            
            if (parts[1].equals("start")) 
                stack.push(Integer.parseInt(parts[0]));
            else {
                res[stack.pop()]++;//记录时间段的end,即下一个时间段的begin
                prevTime++;
            }
        }
       
        return res;
    }
}
Leetcode 636: Exclusive Time of Functions 题目描述: 给定一个单线程的 CPU,这个 CPU 有 n 个需要运行的函数,函数编号从 0 到 n-1。在存储器里,函数以 [s, e, id] 的形式存储,其中 s 表示这个函数开始的时间,e 表示这个函数结束的时间,函数 id 表示这个函数的编号。给定一个日志,格式化字符串表示函数的调用情况,其格式如下: Function ID:StartOrEnd:Timestamp 例如: 0:start:0 1:start:2 1:end:5 0:end:6 表示函数 0 在时间戳 0 的时候开始,在时间戳 6 的时候结束;而函数 1 在时间戳 2 的时候开始,在时间戳 5 的时候结束。函数 0 和函数 1 都执行了一个时间段,函数 1 执行了两个时间段。 请你返回一个表示每个函数执行时间的数组 answer,数组中第 i 个元素表示为函数 i 执行的时间,其中 0 <= i < n。 函数的执行时间是指函数的结束时间减去函数的开始时间。如果一个函数在调用期间没有被其他函数中断,那么它的执行时间就是这个函数的结束时间减去开始时间。如果一个函数在调用期间被其他函数中断,那么它的执行时间就是它的最后一个结束时间减去它的开始时间。保证函数的调用顺序是按照函数编号的升序来表示的。 示例 1: 输入: n = 2 logs = ["0:start:0","1:start:2","1:end:5","0:end:6"] 输出:[3, 4] 解释: 函数 0 在时间戳 0 的时候开始,在时间戳 6 的时候结束,执行时间为 6 - 0 = 6 秒。 函数 1 在时间戳 2 的时候开始,在时间戳 5 的时候结束,执行时间为 5 - 2 = 3 秒。 示例 2: 输入: n = 1 logs = ["0:start:0","0:end:0"] 输出:[1] 解释: 函数 0 在时间戳 0 的时候开始,在时间戳 0 的时候结束,执行时间为 0 秒。 注意:函数调用会存在嵌套情况,例如上例中的logs。函数调用顺序不会超过 1000。函数的最大执行时间为 999ms,保证整数部分不超过 10^7。 解题思路: 这道题是要求每个函数的执行时间,我们可以使用一个栈来维护每个函数的开始和结束时间,遍历 logs,遇到一个函数开始就将其入栈,遇到一个函数结束就将栈顶元素弹出。由于栈中存储的是函数的开始时间,所以结束时间需要减去栈顶元素的开始时间来计算这个函数的执行时间。如果遇到的是函数结束操作,那么栈顶元素就是这个函数的开始时间,需要将它弹出,但是后面的函数可能会依赖于这个栈顶元素,所以需要先计算弹出栈顶元素后的执行时间,再将栈顶元素弹出。 时间复杂度:O(n) 空间复杂度:O(n) 参考代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值