Date: 18/12/2018
Location: Seattle, USA
Initial facebook interview was set up for 45 min and an interviewer asked a single programming question.
Question: https://leetcode.com/problems/exclusive-time-of-functions
/*
Function stage(start/ends) time(start/end)
main start 0
<----------- main running
foo start 3
foo end 7
<----------- main running
zoo start 10
zoo end 13
<-------------- main running
moo start 15
foo start 17
foo end 18
<---------------- moo running
moo end 20
< --------------main running
main end 22
Consolidate time for each function.
*/ class LogInfo
{
String functionName;
String timeType;
int time;
LogInfo(String functionName, String timeType, int time)
{
this.functionName = functionName;
this.timeType = timeType;
this.time = time;
}
}
class LogOfStack
{
String functionName;
int startime;
int totalTime;
LogOfStack(String functionName, int startime, int totalTime)
{
this.functionName = functionName;
this.startime = startime;
this.totalTime = totalTime;
}
}
public Map<String, Integer> consolidation(List<LogInfo> logInfos)
{
final Map<String, Integer> map = new HashMap<>();
final Stack<LogOfStack> activeStack = new Stack<>();
for (final LogInfo info : logInfos)
{
if (info.timeType.equals("start"))
{
if (!activeStack.isEmpty())
{
final LogOfStack previous = activeStack.peek();
previous.totalTime = previous.totalTime + info.time - previous.startime;
previous.startime = info.time;
}
activeStack.push(new LogOfStack(info.functionName, info.time, 0));
}
else
{
LogOfStack previous = activeStack.pop();
previous.totalTime = previous.totalTime + info.time - previous.startime;
if (!map.containsKey(info.functionName))
{
map.put(info.functionName, 0);
}
final int time = map.get(info.functionName) + previous.totalTime;
map.put(info.functionName, time);
if (!activeStack.isEmpty())
{
previous = activeStack.peek();
previous.startime = info.time;
}
}
}
return map;
}
public static void main(String[] arg)
{
Facebook facebook = new Facebook();
String main = "main";
String foo = "foo";
String zoo = "zoo";
String moo = "moo";
String pee = "pee";
List<LogInfo> logInfos = new ArrayList<>();
logInfos.add(facebook.new LogInfo(main, "start", 0));
logInfos.add(facebook.new LogInfo(foo, "start", 3));
logInfos.add(facebook.new LogInfo(foo, "end", 7));
logInfos.add(facebook.new LogInfo(zoo, "start", 10));
logInfos.add(facebook.new LogInfo(zoo, "end", 13));
logInfos.add(facebook.new LogInfo(moo, "start", 15));
logInfos.add(facebook.new LogInfo(foo, "start", 16));
logInfos.add(facebook.new LogInfo(pee, "start", 17));
logInfos.add(facebook.new LogInfo(pee, "end", 18));
logInfos.add(facebook.new LogInfo(foo, "end", 18));
logInfos.add(facebook.new LogInfo(moo, "end", 20));
logInfos.add(facebook.new LogInfo(main, "end", 22));
System.out.println(facebook.consolidation(logInfos));
}
}
</details>