A social media company is trying to monitor activity on their site by analyzing the number of tweets that occur in select periods of time. These periods can be partitioned into smaller time chunks based on a certain frequency (every minute, hour, or day).
For example, the period [10, 10000]
(in seconds) would be partitioned into the following time chunks with these frequencies:
[10,69]
, [70,129]
, [130,189]
, ...
, [9970,10000]
[10,3609]
, [3610,7209]
, [7210,10000]
[10,10000]
Notice that the last chunk may be shorter than the specified frequency's chunk size and will always end with the end time of the period (10000
in the above example).
Design and implement an API to help the company with their analysis.
Implement the TweetCounts
class:
TweetCounts()
Initializes the TweetCounts
object.void recordTweet(String tweetName, int time)
Stores the tweetName
at the recorded time
(in seconds).List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime)
Returns a list of integers representing the number of tweets with tweetName
in each time chunk for the given period of time [startTime, endTime]
(in seconds) and frequency freq
.
freq
is one of "minute"
, "hour"
, or "day"
representing a frequency of every minute, hour, or day respectively.
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); // New tweet "tweet3" at time 0 tweetCounts.recordTweet("tweet3", 60); // New tweet "tweet3" at time 60 tweetCounts.recordTweet("tweet3", 10); // New tweet "tweet3" at time 10 tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // return [2]; chunk [0,59] had 2 tweets tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // return [2,1]; chunk [0,59] had 2 tweets, chunk [60,60] had 1 tweet tweetCounts.recordTweet("tweet3", 120); // New tweet "tweet3" at time 120 tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210); // return [4]; chunk [0,210] had 4 tweets
Constraints:
0 <= time, startTime, endTime <= 109
0 <= endTime - startTime <= 104
104
calls in total to recordTweet
and getTweetCountsPerFrequency
.This problem requires designing a system to track tweet counts within specified time intervals and frequencies. The solution utilizes a data structure to efficiently store and retrieve tweet information.
The optimal data structure for this problem is a combination of a hash map and a sorted set (or a similar structure offering efficient range queries).
Hash Map: A hash map (dictionary in Python) is used to store tweets, with the tweet name as the key and a sorted set (or similar) as the value. This allows for O(1) average-case lookup of tweets by name.
Sorted Set: A sorted set (e.g., SortedList
in Python, TreeMap
in Java, multiset
in C++) stores the timestamps of tweets for a given tweet name. The sorted nature enables efficient range queries using binary search to count tweets within specific time intervals.
The TweetCounts
class has three methods:
__init__
(Constructor): Initializes the hash map data
and a dictionary d
to map frequency strings ("minute", "hour", "day") to their corresponding durations in seconds.
recordTweet(tweetName, time)
: Adds the tweet with tweetName
and timestamp time
to the sorted set associated with tweetName
in the data
hash map.
getTweetCountsPerFrequency(freq, tweetName, startTime, endTime)
: This is the core logic.
f
based on the input freq
.tweetName
.[startTime, endTime]
in chunks of size f
.ans
.ans
list.recordTweet
:
getTweetCountsPerFrequency
:
The code examples in the previous response demonstrate the implementation of the TweetCounts
class in Python, Java, and C++. They utilize the appropriate data structures mentioned above to achieve the required efficiency. Note that the specific implementations for sorted sets may vary slightly depending on the chosen language and libraries.