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:
- Input logs will be sorted by timestamp, NOT log id.
- Your output should be sorted by function id, which means the 0th element of your output corresponds to the exclusive time of function 0.
- Two functions won’t start or end at the same time.
- Functions could be called recursively, and will always end.
- 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
- 若当前函数为开始任务,更新栈顶函数运行时间,入栈当前函数,更新prev
- 若当前函数为结束任务,将栈顶函数出栈,更新出栈函数运行时间,更新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;
}
}