Problem: You are given the logs in [timestamp, user, resource] format which indicates the timestamp when user access a resource. A user session is defined as the earliest timestamp and the latest timestamp when user accessed any resource.
Extract all the user sessions from the logs.
Example:
Input: logs = ["58523", "user_1", "resource_1"], ["62314", "user_2", "resource_2"], ["54001", "user_1", "resource_3"], ["54060", "user_2", "resource_3"], ["54359", "user_1", "resource_3"] Output: user_1 -> (54001 - 58523) user_2 -> (54060 - 62314)
Approach: It's an easy problem to solve by using hashing. You can understand the approach by just looking at the code.
Implementation in C#:
private static Dictionary<string, List<int>> GetUserSession(Log[] logs)
{
Dictionary<string, List<int>> userSessions = new Dictionary<string, List<int>>();
foreach (Log log in logs)
{
if (!userSessions.ContainsKey(log.User))
{
userSessions[log.User] = new List<int>();
}
// User session is already recorded for this user, update if required
if (userSessions[log.User].Count == 2)
{
// current timestamp is lower than existing session's first timestamp
// Make current as first timestamp for this user session
if (log.Timestamp < userSessions[log.User][0])
{
userSessions[log.User][0] = log.Timestamp;
}
// current timestamp is greater than existing session's last timestamp
// Make current as last timestamp for this user session
else if (log.Timestamp > userSessions[log.User][1])
{
userSessions[log.User][1] = log.Timestamp;
}
}
// current timestamp is lower than first timestamp of this user session.
else if (userSessions[log.User].Count == 1 && log.Timestamp < userSessions[log.User][0])
{
userSessions[log.User].Insert(0, log.Timestamp);
}
else
{
userSessions[log.User].Add(log.Timestamp);
}
}
return userSessions;
}
private static void PrintUserSession(Dictionary<string, List<int>> userSessions)
{
foreach(var session in userSessions)
{
string output = session.Key + " -> (" + session.Value[0] + " - ";
if (session.Value.Count == 1)
{
output += session.Value[0] + ")";
}
else
{
output += session.Value[1] + ")";
}
Console.WriteLine(output);
}
}
class Log
{
public int Timestamp {get; private set;}
public string User {get; private set;}
public string Resource {get; private set;}
public Log(string timestamp, string user, string resource)
{
this.Timestamp = int.Parse(timestamp);
this.User = user;
this.Resource = resource;
}
}
Complexity: O(n)
No comments:
Post a Comment