Question asked:
Implement a feature active_twitterati which simulates the following operations.
active_twitterati has two functions:
store - Pushes a twitterati_id on a data structure whenever a user tweets.
find_best_twitterati - Removes and returns the most frequent twitterati_id in the structure.
If there is a tie for the most frequent twitterati_id, the most recent twitterati_id is removed and returned.
Input
["MostFrequentTwtr", "store", "store", "store", "store", "store", "store", "find_best", "find_best", "find_best", "find_best"]
[[], [5], [7], [5], [7], [4], [5], [], [], [], []]
Output
[null, null, null, null, null, null, null, 5, 7, 5, 4]
My approach
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
ActiveTwitterati activeTwitterati = new ActiveTwitterati();
System.out.println(activeTwitterati.findBest());
activeTwitterati.store(5);
activeTwitterati.store(7);
activeTwitterati.store(5);
activeTwitterati.store(7);
activeTwitterati.store(4);
activeTwitterati.store(5);
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
System.out.println(activeTwitterati.findBest());
}
}
class ActiveTwitterati{
HashMap<Integer, Integer> noOfVisits;
HashMap<Integer, Stack<Integer>> freqVisitsMap;
int maxVisit;
public ActiveTwitterati(){
noOfVisits = new HashMap<>();
freqVisitsMap = new HashMap<>();
maxVisit =0;
}
public void store(int id){
if(noOfVisits.containsKey(id)){
int visitCount = noOfVisits.get(id);
updateFreqVisitMap(visitCount+1, id);
} else {
updateFreqVisitMap(1, id);
}
noOfVisits.put(id, noOfVisits.getOrDefault(id, 0)+1);
maxVisit = Math.max(maxVisit, noOfVisits.get(id));
}
public int findBest(){
if(maxVisit == 0)
return -1;
Stack<Integer> usersWithMaxVisits = freqVisitsMap.get(maxVisit);
int bestTwitterati = usersWithMaxVisits.peek();
updateVisitsMap(bestTwitterati);
if(usersWithMaxVisits.size() == 1){
maxVisit--;
}
return usersWithMaxVisits.pop();
}
private void updateFreqVisitMap(int visitCount, int id){
if(freqVisitsMap.containsKey(visitCount)){
Stack<Integer> existingUsers = freqVisitsMap.get(visitCount);
existingUsers.add(id);
freqVisitsMap.put(visitCount, existingUsers);
} else {
Stack<Integer> users = new Stack<>();
users.add(id);
freqVisitsMap.put(visitCount, users);
}
}
private void updateVisitsMap(int id){
noOfVisits.put(id, noOfVisits.get(id)-1);
}
}