1
var TweetCounts = function () {
2
this.map = new Map();
3
};
4

5
TweetCounts.prototype.recordTweet = function (tweetName, time) {
6
if (!this.map.has(tweetName)) this.map.set(tweetName, []);
7
this.map.get(tweetName).push(time);
8
};
9

10
TweetCounts.prototype.getTweetCountsPerFrequency = function (
11
freq,
12
tweetName,
13
startTime,
14
endTime
15
) {
16
if (!this.map.has(tweetName)) return [];
17

18
const tweets = this.map.get(tweetName);
19
const buckets = createBuckets(freq, startTime, endTime);
20

21
for (let i = 0; i < tweets.length; i++) {
22
const tweetTime = tweets[i];
23

24
let left = 0;
25
let right = buckets.length - 1;
26

27
while (left <= right) {
28
const mid = (left + right) >> 1;
29
const [startTime, endTime, count] = buckets[mid];
30

31
if (startTime <= tweetTime && tweetTime <= endTime) {
32
buckets[mid][2] = count + 1;
33
break;
34
}
35

36
if (endTime < tweetTime) left = mid + 1;
37
else right = mid - 1;
38
}
39
}
40

41
const res = [];
42

43
for (let i = 0; i < buckets.length; i++) {
44
res.push(buckets[i][2]);
45
}
46

47
return res;
48

49
function createBuckets(freq, startTime, endTime) {
50
const chunks = { minute: 60, hour: 3600, day: 86400 };
51
const buckets = [];
52

53
let start = startTime;
54

55
while (start <= endTime) {
56
const end = Math.min(start + chunks[freq] - 1, endTime);
57
buckets.push([start, end, 0]);
58
start = end + 1;
59
}
60

61
return buckets;
62
}
63
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0