Skip to content

Commit 32b1eb3

Browse files
edit 636
1 parent 5088672 commit 32b1eb3

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Your ideas/fixes/algorithms are more than welcome!
3030
|640|[Solve the Equation](https://leetcode.com/problems/solve-the-equation/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_640.java) | O(n) |O(n) | Medium |
3131
|638|[Shopping Offers](https://leetcode.com/problems/shopping-offers/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_638.java) | O(2^n) |O(n) | Medium | DP, DFS
3232
|637|[Average of Levels in Binary Tree](https://leetcode.com/problems/average-of-levels-in-binary-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_637.java) | O(n) |O(1) | Easy |
33+
|636|[Exclusive Time of Functions](https://leetcode.com/problems/exclusive-time-of-functions/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_636.java) | O(n) |O(n/2) | Medium | Stack
3334
|635|[Design Log Storage System](https://leetcode.com/problems/design-log-storage-system/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_635.java) | O(n) |O(1) | Medium | Design
3435
|634|[Find the Derangement of An Array](https://leetcode.com/problems/find-the-derangement-of-an-array/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_634.java) | O(n) |O(1) | Medium | Math
3536
|633|[Sum of Square Numbers](https://leetcode.com/problems/sum-of-square-numbers/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_633.java) | O(logn) |O(1) | Easy | Binary Search
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.fishercoder.solutions;
2+
3+
import java.util.Deque;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
7+
/**
8+
* 636. Exclusive Time of Functions
9+
*
10+
* Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU,
11+
* find the exclusive time of these functions.
12+
* Each function has a unique id, start from 0 to n-1.
13+
* A function may be called recursively or by another function.
14+
* A log is a string has this format : function_id:start_or_end:timestamp.
15+
* For example, "0:start:0" means function 0 starts from the very beginning of time 0.
16+
* "0:end:0" means function 0 ends to the very end of time 0.
17+
* Exclusive time of a function is defined as the time spent within this function,
18+
* the time spent by calling other functions should not be considered as this function's exclusive time.
19+
* You should return the exclusive time of each function sorted by their function id.
20+
21+
Example 1:
22+
Input:
23+
n = 2
24+
logs =
25+
["0:start:0",
26+
"1:start:2",
27+
"1:end:5",
28+
"0:end:6"]
29+
Output:[3, 4]
30+
Explanation:
31+
Function 0 starts at time 0, then it executes 2 units of time and reaches the end of time 1.
32+
Now function 0 calls function 1, function 1 starts at time 2, executes 4 units of time and end at time 5.
33+
Function 0 is running again at time 6, and also end at the time 6, thus executes 1 unit of time.
34+
So function 0 totally execute 2 + 1 = 3 units of time, and function 1 totally execute 4 units of time.
35+
36+
Note:
37+
Input logs will be sorted by timestamp, NOT log id.
38+
Your output should be sorted by function id, which means the 0th element of your output corresponds to the exclusive time of function 0.
39+
Two functions won't start or end at the same time.
40+
Functions could be called recursively, and will always end.
41+
1 <= n <= 100
42+
*/
43+
public class _636 {
44+
/**Based on the example, it's difficult to see how function 2 executes 4 units of time, actually
45+
* we can add 1 to all end times to make it easier to understand and AC'ed.*/
46+
public int[] exclusiveTime(int n, List<String> logs) {
47+
/**Stack is the way to go:
48+
* we keep pushing the logId onto the stack whenever we just encounter this logId's start timestamp,
49+
* we'll pop this logId only when we encounter this logId's end timestamp.
50+
* Meanwhile, we keep a counter called prevTime,
51+
* whenever the stack is not empty, we'll always deduct prevTime from the last logId on the stack.*/
52+
Deque<Integer> stack = new LinkedList<>();
53+
int[] result = new int[n];
54+
int prevTime = 0;
55+
for (String log : logs) {
56+
String[] parts = log.split(":");
57+
if (!stack.isEmpty()) {
58+
result[stack.peek()] += Integer.parseInt(parts[2]) - prevTime;
59+
}
60+
prevTime = Integer.parseInt(parts[2]);
61+
if (parts[1].equals("start")) {
62+
stack.addFirst(Integer.parseInt(parts[0]));//i.e. stack.push()
63+
} else {
64+
prevTime++;
65+
//remember to have result pluse 1 to match the problem AC criteria
66+
result[stack.pollFirst()]++;//i.e. stack.pop()
67+
}
68+
}
69+
return result;
70+
}
71+
}

0 commit comments

Comments
 (0)