636-函数的单独执行时间

本文介绍了一种算法,用于计算给定的日志中各函数的独占运行时间。通过使用栈来跟踪函数调用和结束的情况,实现了准确计算每个函数实际运行时间的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find the exclusive time of these functions.

Each function has a unique id, start from 0 to n-1. A function may be called recursively or by another function.

A log is a string has this format : function_id:start_or_end:timestamp. For example, “0:start:0” means function 0 starts from the very beginning of time 0. “0:end:0” means function 0 ends to the very end of time 0.

Exclusive time of a function is defined as the time spent within this function, the time spent by calling other functions should not be considered as this function’s exclusive time. You should 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 time 0, then it executes 2 units of time and reaches the end of time 1. 
Now function 0 calls function 1, function 1 starts at time 2, executes 4 units of time and end at time 5.
Function 0 is running again at time 6, and also end at the time 6, thus executes 1 unit of time. 
So function 0 totally execute 2 + 1 = 3 units of time, and function 1 totally execute 4 units of time.

Note:

  1. Input logs will be sorted by timestamp, NOT log id.
  2. Your output should be sorted by function id, which means the 0th element of your output corresponds to the exclusive time of function 0.
  3. Two functions won’t start or end at the same time.
  4. Functions could be called recursively, and will always end.
  5. 1 <= n <= 100

问题描述

给定在非抢占式单线程CPU上运行的n个函数的运行日志,返回这些函数的单独运行时间。

每个函数都有一个id,id在0到n - 1内。一个函数可以被其他函数调用

一个日志的格式为:function_id:start_or_end:timestamp.例如,”0:start:0”表示0号函数开始于0点的开始。”0:end:0”表示0号函数结束于0点的结束

单独运行时间是在函数内花的时间,调用其他函数花的时间不考虑在内。你应该返回按id排序的每个任务的运行时间


问题分析

维护一个prev保存当前时间点。维护一个stack,保存对应函数id

迭代logs

  1. 若当前函数为开始任务,更新栈顶函数运行时间,入栈当前函数,更新prev
  2. 若当前函数为结束任务,将栈顶函数出栈,更新出栈函数运行时间,更新prev

解法

public class Solution {
    public int[] exclusiveTime(int n, List < String > logs) {
        Stack<Integer> stack = new Stack();
        int[] res = new int[n];
        String[] s = logs.get(0).split(":");
        int i = 1, prev = Integer.parseInt(s[2]);

        stack.push(Integer.parseInt(s[0]));


        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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值