rishu110067

Untitled

Feb 13th, 2022 (edited)
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.04 KB | None | 0 0
  1. class Twitter {
  2.    
  3.     // timestamp is incremented each time we have new tweet
  4.     int timestamp;
  5.    
  6.     // stores tweetId and userId of tweet which was done at timestamp
  7.     ArrayList<ArrayList<Integer>> tweet_with_timestamp;
  8.    
  9.     // stores userIds which a user follows
  10.     Map<Integer, Set<Integer>> follow;
  11.    
  12.     // stores timestamps of tweets done by a user
  13.     Map<Integer, ArrayList<Integer>> tweet;
  14.    
  15.     public Twitter()
  16.     {
  17.         this.timestamp = 0;
  18.         this.tweet_with_timestamp = new ArrayList<ArrayList<Integer>> ();
  19.         this.follow = new HashMap<Integer, Set<Integer>> ();
  20.         this.tweet = new HashMap<Integer, ArrayList<Integer>> ();
  21.     }
  22.    
  23.     public void postTweet(int userId, int tweetId)
  24.     {
  25.         tweet.putIfAbsent(userId, new ArrayList<Integer> ());
  26.         tweet.get(userId).add(timestamp);
  27.         tweet_with_timestamp.add(new ArrayList<Integer> (List.of(tweetId, userId)) );
  28.         timestamp++;
  29.     }
  30.    
  31.     public List<Integer> getNewsFeed(int userId)
  32.     {
  33.         // Adding user to its list of followees
  34.         // This will allow us to consider tweets done by the user itself
  35.         follow.putIfAbsent(userId, new HashSet<Integer>());
  36.         follow.get(userId).add(userId);
  37.        
  38.         // pointer stores the position of the most recent tweet done by a followee
  39.         Map<Integer, Integer> pointer = new HashMap<Integer, Integer> ();
  40.        
  41.         // priority queue stores the timestamp of the most recent tweet done by each followee
  42.         PriorityQueue<Integer> pq = new PriorityQueue<Integer> (Collections.reverseOrder());
  43.        
  44.         for(Integer followeeId: follow.get(userId))
  45.         {
  46.             if(tweet.containsKey(followeeId))
  47.             {
  48.                 int p = tweet.get(followeeId).size() - 1;
  49.                 pointer.put(followeeId, p);
  50.                 pq.add(tweet.get(followeeId).get(p));
  51.             }
  52.         }
  53.        
  54.         ArrayList<Integer> NewsFeed = new ArrayList<Integer> ();
  55.         for(int i = 0; i < 10 && !pq.isEmpty(); i++)
  56.         {  
  57.             int t = pq.poll(); // timestamp of most recent tweet
  58.             int tweetId = tweet_with_timestamp.get(t).get(0);
  59.             int tweetUserId = tweet_with_timestamp.get(t).get(1);
  60.            
  61.             NewsFeed.add(tweetId);
  62.             int p = pointer.get(tweetUserId);
  63.             if(p > 0)
  64.             {
  65.                 // Adding the timestamp of the next most recent tweet done by the tweetUser in priority queue
  66.                 pointer.put(tweetUserId, p-1);
  67.                 pq.add(tweet.get(tweetUserId).get(p-1));
  68.             }
  69.         }
  70.         return NewsFeed;
  71.     }
  72.    
  73.     public void follow(int followerId, int followeeId)
  74.     {
  75.         follow.putIfAbsent(followerId, new HashSet<Integer>());
  76.         follow.get(followerId).add(followeeId);
  77.     }
  78.    
  79.     public void unfollow(int followerId, int followeeId)
  80.     {
  81.         if(follow.containsKey(followerId)) {
  82.             follow.get(followerId).remove(followeeId);
  83.         }
  84.     }
  85. }
Add Comment
Please, Sign In to add comment