Skip to content

Commit 9748e62

Browse files
add 1348
1 parent 040066f commit 9748e62

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ _If you like this project, please leave me a star._ ★
88

99
| # | Title | Solutions | Video | Difficulty | Tag
1010
|-----|----------------|---------------|--------|-------------|-------------
11+
|1348|[Tweet Counts Per Frequency](https://leetcode.com/problems/tweet-counts-per-frequency/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_1348.java) | |Medium|Design|
1112
|1347|[Minimum Number of Steps to Make Two Strings Anagram](https://leetcode.com/problems/minimum-number-of-steps-to-make-two-strings-anagram/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_1347.java) | |Easy|String|
1213
|1346|[Check If N and Its Double Exist](https://leetcode.com/problems/check-if-n-and-its-double-exist/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_1346.java) | |Easy|Array|
1314
|1345|[Jump Game IV](https://leetcode.com/problems/jump-game-iv/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_1345.java) | |Hard|BFS|
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.fishercoder.solutions;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.TreeMap;
8+
9+
/**
10+
* 1348. Tweet Counts Per Frequency
11+
*
12+
* Implement the class TweetCounts that supports two methods:
13+
*
14+
* 1. recordTweet(string tweetName, int time)
15+
* Stores the tweetName at the recorded time (in seconds).
16+
* 2. getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)
17+
* Returns the total number of occurrences for the given tweetName per minute, hour, or day (depending on freq) starting from the startTime (in seconds) and ending at the endTime (in seconds).
18+
* freq is always minute, hour or day, representing the time interval to get the total number of occurrences for the given tweetName.
19+
* The first time interval always starts from the startTime,
20+
* 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).
21+
*
22+
* Example:
23+
* Input
24+
* ["TweetCounts","recordTweet","recordTweet","recordTweet","getTweetCountsPerFrequency","getTweetCountsPerFrequency","recordTweet","getTweetCountsPerFrequency"]
25+
* [[],["tweet3",0],["tweet3",60],["tweet3",10],["minute","tweet3",0,59],["minute","tweet3",0,60],["tweet3",120],["hour","tweet3",0,210]]
26+
*
27+
* Output
28+
* [null,null,null,null,[2],[2,1],null,[4]]
29+
*
30+
* Explanation
31+
* TweetCounts tweetCounts = new TweetCounts();
32+
* tweetCounts.recordTweet("tweet3", 0);
33+
* tweetCounts.recordTweet("tweet3", 60);
34+
* tweetCounts.recordTweet("tweet3", 10); // All tweets correspond to "tweet3" with recorded times at 0, 10 and 60.
35+
* 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.
36+
* 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.
37+
* tweetCounts.recordTweet("tweet3", 120); // All tweets correspond to "tweet3" with recorded times at 0, 10, 60 and 120.
38+
* 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.
39+
*
40+
* Constraints:
41+
* There will be at most 10000 operations considering both recordTweet and getTweetCountsPerFrequency.
42+
* 0 <= time, startTime, endTime <= 10^9
43+
* 0 <= endTime - startTime <= 10^4
44+
* */
45+
public class _1348 {
46+
public static class Solution1 {
47+
public static class TweetCounts {
48+
/**
49+
* credit: https://leetcode.com/problems/tweet-counts-per-frequency/discuss/503453/Java-TreeMap-Accepted-Solution-Easy-Understand
50+
*/
51+
private Map<String, TreeMap<Integer, Integer>> map;
52+
53+
public TweetCounts() {
54+
map = new HashMap<>();
55+
}
56+
57+
public void recordTweet(String tweetName, int time) {
58+
if (!map.containsKey(tweetName)) {
59+
map.put(tweetName, new TreeMap<>());
60+
}
61+
TreeMap<Integer, Integer> tweetMap = map.get(tweetName);
62+
tweetMap.put(time, tweetMap.getOrDefault(time, 0) + 1);
63+
}
64+
65+
public List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) {
66+
if (!map.containsKey(tweetName)) {
67+
return null;
68+
}
69+
int interval;
70+
if (freq.equals("minute")) {
71+
interval = 60;
72+
} else if (freq.equals("hour")) {
73+
interval = 60 * 60;
74+
} else {
75+
interval = 60 * 60 * 24;
76+
}
77+
int size = ((endTime - startTime) / interval) + 1;
78+
int[] buckets = new int[size];
79+
TreeMap<Integer, Integer> tweetMap = map.get(tweetName);
80+
for (Map.Entry<Integer, Integer> entry : tweetMap.subMap(startTime, endTime + 1).entrySet()) {
81+
int index = (entry.getKey() - startTime) / interval;
82+
buckets[index] += entry.getValue();
83+
}
84+
List<Integer> result = new ArrayList<>();
85+
for (int num : buckets) {
86+
result.add(num);
87+
}
88+
return result;
89+
}
90+
}
91+
}
92+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.fishercoder;
2+
3+
import com.fishercoder.solutions._1348;
4+
import org.junit.Test;
5+
6+
import java.util.Arrays;
7+
8+
import static org.junit.Assert.assertEquals;
9+
10+
public class _1348Test {
11+
private static _1348.Solution1.TweetCounts tweetCounts;
12+
13+
@Test
14+
public void test1() {
15+
tweetCounts = new _1348.Solution1.TweetCounts();
16+
17+
tweetCounts.recordTweet("tweet3", 0);
18+
tweetCounts.recordTweet("tweet3", 60);
19+
tweetCounts.recordTweet("tweet3", 10);
20+
assertEquals(Arrays.asList(2), tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59));
21+
assertEquals(Arrays.asList(2, 1), tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60));
22+
tweetCounts.recordTweet("tweet3", 120);
23+
assertEquals(Arrays.asList(4), tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210));
24+
}
25+
26+
@Test
27+
public void test2() {
28+
tweetCounts = new _1348.Solution1.TweetCounts();
29+
30+
tweetCounts.recordTweet("tweet0", 33);
31+
tweetCounts.recordTweet("tweet1", 89);
32+
tweetCounts.recordTweet("tweet2", 99);
33+
tweetCounts.recordTweet("tweet3", 53);
34+
tweetCounts.recordTweet("tweet4", 3);
35+
assertEquals(Arrays.asList(0), tweetCounts.getTweetCountsPerFrequency("hour", "tweet0", 89, 3045));
36+
tweetCounts.recordTweet("tweet0", 28);
37+
tweetCounts.recordTweet("tweet0", 91);
38+
tweetCounts.recordTweet("tweet0", 9);
39+
tweetCounts.recordTweet("tweet1", 6);
40+
}
41+
42+
@Test
43+
public void test3() {
44+
tweetCounts = new _1348.Solution1.TweetCounts();
45+
46+
tweetCounts.recordTweet("tweet0", 13);
47+
tweetCounts.recordTweet("tweet1", 16);
48+
tweetCounts.recordTweet("tweet2", 12);
49+
tweetCounts.recordTweet("tweet3", 18);
50+
tweetCounts.recordTweet("tweet4", 82);
51+
tweetCounts.recordTweet("tweet3", 89);
52+
assertEquals(Arrays.asList(0), tweetCounts.getTweetCountsPerFrequency("day", "tweet0", 89, 9471));
53+
assertEquals(Arrays.asList(2, 0), tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 13, 4024));
54+
}
55+
}

0 commit comments

Comments
 (0)