1348. Tweet Counts Per Frequency
Medium
Implement the class TweetCounts that supports two methods:
1. recordTweet(string tweetName, int time)
- Stores the tweetNameat the recordedtime(in seconds).
2. getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)
- Returns the total number of occurrences for the given tweetNameper minute, hour, or day (depending onfreq) starting from thestartTime(in seconds) and ending at theendTime(in seconds).
- freqis always minute, hour 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 numberianddelta(which depends onfreq).
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 10000operations considering bothrecordTweetandgetTweetCountsPerFrequency.
- 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