【leetcode】1348. Tweet Counts Per Frequency
题目如下:
Implement the class
TweetCounts
that supports two methods:1.
recordTweet(string tweetName, int time)
- Stores the
tweetName
at the recordedtime
(in seconds).2.
getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)
- Returns the total number of occurrences for the given
tweetName
per minute, hour, or day (depending onfreq
) starting from thestartTime
(in seconds) and ending at theendTime
(in seconds).freq
is always minute, hour or day, representing the time interval to get the total number of occurrences for the giventweetName
.- 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 numberi
anddelta
(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
10000
operations considering bothrecordTweet
andgetTweetCountsPerFrequency
.0 <= time, startTime, endTime <= 10^9
0 <= endTime - startTime <= 10^4
解题思路:题目不难,用hash表就行了,以tweetName作为key值,把所有的time按升级排列保存到key值所对应的list中。查找的时候使用二分查找,找出左右两边的inx即可。
代码如下:
import bisect class TweetCounts(object): dic = {} def __init__(self): self.dic = {} def recordTweet(self, tweetName, time): """ :type tweetName: str :type time: int :rtype: None """ if tweetName not in self.dic: self.dic[tweetName] = [time] else: bisect.insort_left(self.dic[tweetName] ,time) def getTweetCountsPerFrequency(self, freq, tweetName, startTime, endTime): """ :type freq: str :type tweetName: str :type startTime: int :type endTime: int :rtype: List[int] """ if tweetName not in self.dic: return [] res = [] val = 0 if freq == 'minute': val = 60 elif freq == 'hour': val = 3600 else:val = 86400 start = startTime while start <= endTime: inx1 = bisect.bisect_left(self.dic[tweetName],start) end = min(start + val- 1,endTime) inx2 = bisect.bisect_left(self.dic[tweetName],end) v = inx2 - inx1 if inx2 < len(self.dic[tweetName]) and (self.dic[tweetName][inx2] == end) : v += 1 res.append(v) start += val return res # Your TweetCounts object will be instantiated and called as such: # obj = TweetCounts() # obj.recordTweet(tweetName,time) # param_2 = obj.getTweetCountsPerFrequency(freq,tweetName,startTime,endTime)