resource Access with in 5 min
public class Solution {
public static void main(String[] args) {
String[][] logs1 = new String[][] {
{ "58523", "user_1", "resource_1" },
{ "62314", "user_2", "resource_2" },
{ "54001", "user_1", "resource_3" },
{ "200", "user_6", "resource_5" },
{ "215", "user_6", "resource_4" },
{ "54060", "user_2", "resource_3" },
{ "53760", "user_3", "resource_3" },
{ "58522", "user_22", "resource_1" },
{ "53651", "user_5", "resource_3" },
{ "2", "user_6", "resource_1" },
{ "100", "user_6", "resource_6" },
{ "400", "user_7", "resource_2" },
{ "100", "user_8", "resource_6" },
{ "54359", "user_1", "resource_3"},
};
String[][] logs2 = new String[][] {
{"300", "user_1", "resource_3"},
{"599", "user_1", "resource_3"},
{"900", "user_1", "resource_3"},
{"1199", "user_1", "resource_3"},
{"1200", "user_1", "resource_3"},
{"1201", "user_1", "resource_3"},
{"1202", "user_1", "resource_3"}
};
String[][] logs3 = new String[][] {
{"300", "user_10", "resource_5"}
};
System.out.println(mostRequestedResource(logs1));
System.out.println(mostRequestedResource(logs2));
System.out.println(mostRequestedResource(logs3));
}
private static List<String> mostRequestedResource(String[][] logs) {
Map<String,ArrayList<Integer>> accessMap = new HashMap<>();
for (String[] entry : logs) {
Integer accessTime = Integer.parseInt(entry[0]);
String resourceId = entry[2];
if (accessMap.containsKey(resourceId)) {
var exList = accessMap.get(resourceId);
exList.add(accessTime);
accessMap.put(resourceId, exList);
} else {
ArrayList<Integer> newList = new ArrayList<>();
newList.add(accessTime);
accessMap.put(resourceId, newList);
}
}
String maxResource = "";
Integer maxWindowTime = 0;
for (var entry : accessMap.entrySet()) {
Integer entryTime = windowCount(entry.getValue(), 300);
if (entryTime > maxWindowTime) {
maxResource = entry.getKey();
maxWindowTime = entryTime;
}
}
List<String> result = new ArrayList<>();
result.add(maxResource);
result.add(maxWindowTime.toString());
return result;
}
private static Integer windowCount(ArrayList<Integer> accessTimes, Integer window) {
Collections.sort(accessTimes);
int maxWindowTime = 0;
for (Integer testVal : accessTimes) {
List<Integer> timesInWindow = accessTimes.stream()
.filter(val -> val >= testVal)
.filter(val -> val <= (testVal + window)).toList();
int testWindowTime = timesInWindow.size();
maxWindowTime = Integer.max(maxWindowTime, testWindowTime);
}
return maxWindowTime;
}Last updated