Skip to content

Instantly share code, notes, and snippets.

@igavrysh
Last active March 19, 2024 21:22
Show Gist options
  • Save igavrysh/9563ef1405d39d810927088a480d1252 to your computer and use it in GitHub Desktop.
Save igavrysh/9563ef1405d39d810927088a480d1252 to your computer and use it in GitHub Desktop.
class Solution {
private int[] parse(String log) {
int n = log.length();
int i = 0;
int[] res = new int[3];
char ch = log.charAt(i);
int curr = 0;
while (ch != ':') {
curr = curr * 10 + (ch-'0');
i++;
ch = log.charAt(i);
}
res[0] = curr;
i++;
res[2] = log.charAt(i) == 's' ? 0 : 1;
curr = 0;
i = 0;
ch = log.charAt(n-1);
while (ch != ':') {
curr += (ch-'0') * (int)Math.pow(10, i++);
ch = log.charAt(n-1-i);
}
res[1] = curr;
return res;
}
public int[] exclusiveTime(int n, List<String> logs) {
int[] output = new int[n];
ArrayDeque<int[]> stack = new ArrayDeque<>();
for (int i = 0; i < logs.size(); i++) {
int[] curr = parse(logs.get(i));
if (curr[2]==0) {
stack.push(curr);
} else {
int[] start = stack.pop();
int d = curr[1] - start[1] + 1;
if (start[0] != curr[0]) { throw new RuntimeException("unexp state reached"); }
output[curr[0]] += d - start[2]; // account for overlapping
if (!stack.isEmpty()) {
int[] top = stack.pop();
top[2] += d;
stack.push(top);
}
}
}
return output;
}
}
/*
636. Exclusive Time of Functions
Medium
https://leetcode.com/problems/exclusive-time-of-functions/description/
On a single-threaded CPU, we execute a program containing n functions. Each function has a unique ID between 0 and n-1.
Function calls are stored in a call stack: when a function call starts, its ID is pushed onto the stack, and when a function call ends, its ID is popped off the stack. The function whose ID is at the top of the stack is the current function being executed. Each time a function starts or ends, we write a log with the ID, whether it started or ended, and the timestamp.
You are given a list logs, where logs[i] represents the ith log message formatted as a string "{function_id}:{"start" | "end"}:{timestamp}". For example, "0:start:3" means a function call with function ID 0 started at the beginning of timestamp 3, and "1:end:2" means a function call with function ID 1 ended at the end of timestamp 2. Note that a function can be called multiple times, possibly recursively.
A function's exclusive time is the sum of execution times for all function calls in the program. For example, if a function is called twice, one call executing for 2 time units and another call executing for 1 time unit, the exclusive time is 2 + 1 = 3.
Return the exclusive time of each function in an array, where the value at the ith index represents the exclusive time for the function with ID i.
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 the beginning of time 0, then it executes 2 for units of time and reaches the end of time 1.
Function 1 starts at the beginning of time 2, executes for 4 units of time, and ends at the end of time 5.
Function 0 resumes execution at the beginning of time 6 and executes for 1 unit of time.
So function 0 spends 2 + 1 = 3 units of total time executing, and function 1 spends 4 units of total time executing.
Example 2:
Input: n = 1, logs = ["0:start:0","0:start:2","0:end:5","0:start:6","0:end:6","0:end:7"]
Output: [8]
Explanation:
Function 0 starts at the beginning of time 0, executes for 2 units of time, and recursively calls itself.
Function 0 (recursive call) starts at the beginning of time 2 and executes for 4 units of time.
Function 0 (initial call) resumes execution then immediately calls itself again.
Function 0 (2nd recursive call) starts at the beginning of time 6 and executes for 1 unit of time.
Function 0 (initial call) resumes execution at the beginning of time 7 and executes for 1 unit of time.
So function 0 spends 2 + 4 + 1 + 1 = 8 units of total time executing.
Example 3:
Input: n = 2, logs = ["0:start:0","0:start:2","0:end:5","1:start:6","1:end:6","0:end:7"]
Output: [7,1]
Explanation:
Function 0 starts at the beginning of time 0, executes for 2 units of time, and recursively calls itself.
Function 0 (recursive call) starts at the beginning of time 2 and executes for 4 units of time.
Function 0 (initial call) resumes execution then immediately calls function 1.
Function 1 starts at the beginning of time 6, executes 1 unit of time, and ends at the end of time 6.
Function 0 resumes execution at the beginning of time 6 and executes for 2 units of time.
So function 0 spends 2 + 4 + 1 = 7 units of total time executing, and function 1 spends 1 unit of total time executing.
*/
// Most optimized
/*
// https://www.youtube.com/@passorfailio
class Solution {
private int[] parse(String log) {
int i = 0;
int[] res = new int[3];
int n = log.length();
while (log.charAt(i) != ':') {
res[0] = res[0] * 10 + (log.charAt(i)-'0');
i++;
}
i++;
res[2] = log.charAt(i) == 's' ? 0 : 1;
i += (log.charAt(i) == 's' ? 5 : 3)+1;
while (i < n) {
res[1] = res[1] * 10 + (log.charAt(i)-'0');
i++;
}
return res;
}
public int[] exclusiveTime(int n, List<String> logs) {
int[] output = new int[n];
int[][] stack = new int[logs.size()/2][3];
int ptr = 0;
for (int i = 0; i < logs.size(); i++) {
int[] curr = parse(logs.get(i));
if (curr[2]==0) {
stack[ptr++] = curr;
} else {
int[] start = stack[--ptr];
int d = curr[1] - start[1] + 1;
if (start[0] != curr[0]) { throw new RuntimeException("unexp state reached"); }
output[curr[0]] += d - start[2]; // account for overlapping
if (ptr != 0) {
stack[ptr-1][2] += d;
}
}
}
System.gc();
return output;
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment