1+ package com .leetcode .stacks ;
2+
3+ import javafx .util .Pair ;
4+
5+ import java .util .Arrays ;
6+ import java .util .List ;
7+ import java .util .Stack ;
8+
9+ import static org .junit .jupiter .api .Assertions .assertEquals ;
10+
11+ /**
12+ * Level: Medium
13+ * Link: https://leetcode.com/problems/exclusive-time-of-functions/
14+ * Description:
15+ * On a single threaded CPU, we execute some functions. Each function has a unique id between 0 and N-1.
16+ *
17+ * We store logs in timestamp order that describe when a function is entered or exited.
18+ *
19+ * Each log is a string with this format: "{function_id}:{"start" | "end"}:{timestamp}". For example, "0:start:3"
20+ * means the function with id 0 started at the beginning of timestamp 3. "1:end:2" means the function with id 1 ended
21+ * at the end of timestamp 2.
22+ *
23+ * A function's exclusive time is the number of units of time spent in this function. Note that this does not include
24+ * any recursive calls to child functions.
25+ *
26+ * The CPU is single threaded which means that only one function is being executed at a given time unit.
27+ *
28+ * Return the exclusive time of each function, sorted by their function id.
29+ *
30+ * Input:
31+ * n = 2
32+ * logs = ["0:start:0","1:start:2","1:end:5","0:end:6"]
33+ * Output: [3, 4]
34+ * Explanation:
35+ * Function 0 starts at the beginning of time 0, then it executes 2 units of time and reaches the end of time 1.
36+ * Now function 1 starts at the beginning of time 2, executes 4 units of time and ends at time 5.
37+ * 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.
38+ * So function 0 spends 2 + 1 = 3 units of total time executing, and function 1 spends 4 units of total time executing.
39+ *
40+ *
41+ * Note:
42+ * -> 1 <= n <= 100
43+ * -> Two functions won't start or end at the same time.
44+ * -> Functions will always log when they exit.
45+ *
46+ * @author rampatra
47+ * @since 2019-08-17
48+ */
49+ public class ExclusiveTimeOfFunctions {
50+
51+ /**
52+ * Runtime: <a href="https://leetcode.com/submissions/detail/252509066/">18 ms</a>.
53+ *
54+ * @param n
55+ * @param logs
56+ * @return
57+ */
58+ public static int [] exclusiveTime (int n , List <String > logs ) {
59+ int [] times = new int [n ];
60+ Stack <Pair <Integer , Integer >> stack = new Stack <>();
61+
62+ for (String log : logs ) {
63+ String [] l = log .split (":" );
64+ int id = Integer .parseInt (l [0 ]);
65+ String operation = l [1 ];
66+ int timestamp = Integer .parseInt (l [2 ]);
67+
68+ if (operation .equals ("start" )) {
69+ if (!stack .empty ()) {
70+ times [stack .peek ().getKey ()] += (timestamp - stack .peek ().getValue () - 1 );
71+ }
72+ stack .push (new Pair <>(id , timestamp ));
73+ } else {
74+ times [id ] += timestamp - stack .pop ().getValue () + 1 ;
75+ if (!stack .isEmpty ()) {
76+ stack .push (new Pair <>(stack .pop ().getKey (), timestamp ));
77+ }
78+ }
79+ }
80+
81+ return times ;
82+ }
83+
84+ public static void main (String [] args ) {
85+ assertEquals ("[4]" , Arrays .toString (exclusiveTime (1 , Arrays .asList ("0:start:0" , "0:start:1" , "0:end:2" , "0:end:3" ))));
86+ assertEquals ("[6]" , Arrays .toString (exclusiveTime (1 , Arrays .asList ("0:start:0" , "0:start:1" , "0:start:2" , "0:end:3" , "0:end:4" , "0:end:5" ))));
87+ assertEquals ("[3, 4]" , Arrays .toString (exclusiveTime (2 , Arrays .asList ("0:start:0" , "1:start:2" , "1:end:5" , "0:end:6" ))));
88+ }
89+ }
0 commit comments