zoukankan      html  css  js  c++  java
  • 【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 recorded time (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 on freq) starting from the startTime (in seconds) and ending at the endTime (in seconds).
    • freq is always minutehour 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 number i and delta (which depends on freq).  

    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 both recordTweet and getTweetCountsPerFrequency.
    • 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)
  • 相关阅读:
    MyEclipse安装Freemarker插件
    C# winform webbrowser如何指定内核
    tfs清除服务器印射
    在sql中怎样把int行转化成我想要的格式,比如把1转化为'001',
    为项目加入npoi
    .net邮件错误 :The specified string is not in the form required for a subject.
    C#编程总结(十)字符转码
    ,字符串,列表,元组,字典
    简单登录,编码解码,
    密码*** ,continue,等差求和
  • 原文地址:https://www.cnblogs.com/seyjs/p/12287763.html
Copyright © 2011-2022 走看看