Monday, March 15, 2021

LeetCode [1348] Tweet Counts Per Frequency

 1348. Tweet Counts Per Frequency

Medium

Implement the class TweetCounts that supports two methods:

1. recordTweet(string tweetName, int time)

  • Stores the tweetName at the recorded time (in seconds).

2. getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)

  • Returns the total number of occurrences for the given tweetName per minutehour, or day (depending on freq) starting from the startTime (in seconds) and ending at the endTime (in seconds).
  • freq is always minutehour or day, representing the time interval to get the total number of occurrences for the given tweetName.
  • The first time interval always starts from the startTime, so the time intervals are [startTime, startTime + delta*1>,  [startTime + delta*1, startTime + delta*2>, [startTime + delta*2, startTime + delta*3>, ... , [startTime + delta*i, min(startTime + delta*(i+1), endTime + 1)> for some non-negative number i and delta (which depends on freq).  

 

Example:

Input
["TweetCounts","recordTweet","recordTweet","recordTweet","getTweetCountsPerFrequency","getTweetCountsPerFrequency","recordTweet","getTweetCountsPerFrequency"]
[[],["tweet3",0],["tweet3",60],["tweet3",10],["minute","tweet3",0,59],["minute","tweet3",0,60],["tweet3",120],["hour","tweet3",0,210]]

Output
[null,null,null,null,[2],[2,1],null,[4]]

Explanation
TweetCounts tweetCounts = new TweetCounts();
tweetCounts.recordTweet("tweet3", 0);
tweetCounts.recordTweet("tweet3", 60);
tweetCounts.recordTweet("tweet3", 10);                             // All tweets correspond to "tweet3" with recorded times at 0, 10 and 60.
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // return [2]. The frequency is per minute (60 seconds), so there is one interval of time: 1) [0, 60> - > 2 tweets.
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // return [2, 1]. The frequency is per minute (60 seconds), so there are two intervals of time: 1) [0, 60> - > 2 tweets, and 2) [60,61> - > 1 tweet.
tweetCounts.recordTweet("tweet3", 120);                            // All tweets correspond to "tweet3" with recorded times at 0, 10, 60 and 120.
tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210);  // return [4]. The frequency is per hour (3600 seconds), so there is one interval of time: 1) [0, 211> - > 4 tweets.

 

Constraints:

  • There will be at most 10000 operations considering both recordTweet and getTweetCountsPerFrequency.
  • 0 <= time, startTime, endTime <= 10^9
  • 0 <= endTime - startTime <= 10^4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class TweetCounts {
    Map<String, Integer> fMap = new HashMap<>();
    Map<String, TreeMap<Integer, Integer>> map = new HashMap<>();
    public TweetCounts() {
        fMap.put("minute", 60);
        fMap.put("hour", 60*60);
        fMap.put("day", 60*60*24);
    }
    
    public void recordTweet(String tweetName, int time) {
        if(!map.containsKey(tweetName)) map.put(tweetName, new TreeMap<>());
        TreeMap<Integer, Integer> tMap = map.get(tweetName);
        tMap.put(time, tMap.getOrDefault(time, 0)+1);
    }
    
    void printMap(String name){
        for(Map.Entry<Integer, Integer> en : map.get(name).entrySet()){
            System.out.print(en.getKey()+"->"+en.getValue()+"   ");
        }
        System.out.println();
    }
    
    public List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) {
   //     printMap(tweetName);
        List<Integer> list = new ArrayList<>();
        int d = fMap.get(freq);
        if(map.containsKey(tweetName)){
            TreeMap<Integer, Integer> tMap = map.get(tweetName);
            int a = startTime;
            while(a<=endTime){
                int b = a + d - 1;
                int r = 0;
                for(Map.Entry<Integer, Integer> en : map.get(tweetName).subMap(a, true, b, true).entrySet()){
                    r += en.getValue();
                }
                list.add(r);
                a = b+1;
            }
        }
        return list;
    }
}

No comments:

Post a Comment