636. 函式的獨佔時間

會飛的雞翅膀發表於2020-11-12

題目描述

給出一個非搶佔單執行緒CPU的 n 個函式執行日誌,找到函式的獨佔時間。

每個函式都有一個唯一的 Id,從 0 到 n-1,函式可能會遞迴呼叫或者被其他函式呼叫。

日誌是具有以下格式的字串:function_id:start_or_end:timestamp。例如:“0:start:0” 表示函式 0 從 0 時刻開始執行。“0: end :0” 表示函式 0 在 0 時刻結束。

函式的獨佔時間定義是在該方法中花費的時間,呼叫其他函式花費的時間不算該函式的獨佔時間。你需要根據函式的 Id 有序地返回每個函式的獨佔時間。

示例 1:

輸入:

n = 2

logs =

[“0:start:0”,

“1: start :2”,

“1: end :5”,

“0: end :6”]

輸出:[3, 4]

說明:

函式 0 在時刻 0 開始,在執行了 2個時間單位結束於時刻 1。

現在函式 0 呼叫函式 1,函式 1 在時刻 2 開始,執行 4 個時間單位後結束於時刻 5。

函式 0 再次在時刻 6 開始執行,並在時刻 6 結束執行,從而執行了 1 個時間單位。

所以函式 0 總共的執行了 2 +1 =3 個時間單位,函式 1 總共執行了 4 個時間單位。

說明:

  1. 輸入的日誌會根據時間戳排序,而不是根據日誌Id排序。
  2. 你的輸出會根據函式Id排序,也就意味著你的輸出陣列中序號為 0 的元素相當於函式 0 的執行時間。
  3. 兩個函式不會在同時開始或結束。
  4. 函式允許被遞迴呼叫,直到執行結束。
  5. 1 <= n <= 100

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/exclusive-time-of-functions
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路

class Solution {
    public int[] exclusiveTime(int n, List<String> logs) {
        int[] res = new int[n];
        Stack<Integer> stack = new Stack<>();
        int i = 1;
        String[] firstLog = logs.get(0).split(":");
        int preIndex = Integer.parseInt(firstLog[2]);
        stack.push(Integer.parseInt(firstLog[0]));
        while(i < logs.size()){
            String[] log = logs.get(i).split(":");
            if(log[1].equals("start")){
                if(!stack.isEmpty())
                res[stack.peek()] += Integer.parseInt(log[2]) - preIndex;
                stack.push(Integer.parseInt(log[0]));
                preIndex = Integer.parseInt(log[2]);
            }else{
                res[stack.peek()] += Integer.parseInt(log[2]) - preIndex + 1;
                stack.pop();
                preIndex = Integer.parseInt(log[2]) + 1;
            }
            i++;
        }
        return res;
    }
}

相關文章