Twitter | SSE | Best twitterati
Anonymous User
1879

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);
    }
    
}
Comments (3)