返回介绍

solution / 1300-1399 / 1348.Tweet Counts Per Frequency / README_EN

发布于 2024-06-17 01:03:20 字数 7677 浏览 0 评论 0 收藏 0

1348. Tweet Counts Per Frequency

中文文档

Description

A social media company is trying to monitor activity on their site by analyzing the number of tweets that occur in select periods of time. These periods can be partitioned into smaller time chunks based on a certain frequency (every minute, hour, or day).

For example, the period [10, 10000] (in seconds) would be partitioned into the following time chunks with these frequencies:

  • Every minute (60-second chunks): [10,69], [70,129], [130,189], ..., [9970,10000]
  • Every hour (3600-second chunks): [10,3609], [3610,7209], [7210,10000]
  • Every day (86400-second chunks): [10,10000]

Notice that the last chunk may be shorter than the specified frequency's chunk size and will always end with the end time of the period (10000 in the above example).

Design and implement an API to help the company with their analysis.

Implement the TweetCounts class:

  • TweetCounts() Initializes the TweetCounts object.
  • void recordTweet(String tweetName, int time) Stores the tweetName at the recorded time (in seconds).
  • List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) Returns a list of integers representing the number of tweets with tweetName in each time chunk for the given period of time [startTime, endTime] (in seconds) and frequency freq.
    • freq is one of "minute", "hour", or "day" representing a frequency of every minute, hour, or day respectively.

 

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);                // New tweet "tweet3" at time 0
tweetCounts.recordTweet("tweet3", 60);               // New tweet "tweet3" at time 60
tweetCounts.recordTweet("tweet3", 10);               // New tweet "tweet3" at time 10
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // return [2]; chunk [0,59] had 2 tweets
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // return [2,1]; chunk [0,59] had 2 tweets, chunk [60,60] had 1 tweet
tweetCounts.recordTweet("tweet3", 120);              // New tweet "tweet3" at time 120
tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210);  // return [4]; chunk [0,210] had 4 tweets

 

Constraints:

  • 0 <= time, startTime, endTime <= 109
  • 0 <= endTime - startTime <= 104
  • There will be at most 104 calls in total to recordTweet and getTweetCountsPerFrequency.

Solutions

Solution 1

from sortedcontainers import SortedList


class TweetCounts:
  def __init__(self):
    self.d = {"minute": 60, "hour": 3600, "day": 86400}
    self.data = defaultdict(SortedList)

  def recordTweet(self, tweetName: str, time: int) -> None:
    self.data[tweetName].add(time)

  def getTweetCountsPerFrequency(
    self, freq: str, tweetName: str, startTime: int, endTime: int
  ) -> List[int]:
    f = self.d[freq]
    tweets = self.data[tweetName]
    t = startTime
    ans = []
    while t <= endTime:
      l = tweets.bisect_left(t)
      r = tweets.bisect_left(min(t + f, endTime + 1))
      ans.append(r - l)
      t += f
    return ans


# Your TweetCounts object will be instantiated and called as such:
# obj = TweetCounts()
# obj.recordTweet(tweetName,time)
# param_2 = obj.getTweetCountsPerFrequency(freq,tweetName,startTime,endTime)
class TweetCounts {
  private Map<String, TreeMap<Integer, Integer>> data = new HashMap<>();

  public TweetCounts() {
  }

  public void recordTweet(String tweetName, int time) {
    data.putIfAbsent(tweetName, new TreeMap<>());
    var tm = data.get(tweetName);
    tm.put(time, tm.getOrDefault(time, 0) + 1);
  }

  public List<Integer> getTweetCountsPerFrequency(
    String freq, String tweetName, int startTime, int endTime) {
    int f = 60;
    if ("hour".equals(freq)) {
      f = 3600;
    } else if ("day".equals(freq)) {
      f = 86400;
    }
    var tm = data.get(tweetName);
    List<Integer> ans = new ArrayList<>();
    for (int i = startTime; i <= endTime; i += f) {
      int s = 0;
      int end = Math.min(i + f, endTime + 1);
      for (int v : tm.subMap(i, end).values()) {
        s += v;
      }
      ans.add(s);
    }
    return ans;
  }
}

/**
 * Your TweetCounts object will be instantiated and called as such:
 * TweetCounts obj = new TweetCounts();
 * obj.recordTweet(tweetName,time);
 * List<Integer> param_2 = obj.getTweetCountsPerFrequency(freq,tweetName,startTime,endTime);
 */
class TweetCounts {
public:
  TweetCounts() {
  }

  void recordTweet(string tweetName, int time) {
    data[tweetName].insert(time);
  }

  vector<int> getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime) {
    int f = 60;
    if (freq == "hour")
      f = 3600;
    else if (freq == "day")
      f = 86400;
    vector<int> ans((endTime - startTime) / f + 1);
    auto l = data[tweetName].lower_bound(startTime);
    auto r = data[tweetName].upper_bound(endTime);
    for (; l != r; ++l) {
      ++ans[(*l - startTime) / f];
    }
    return ans;
  }

private:
  unordered_map<string, multiset<int>> data;
};

/**
 * Your TweetCounts object will be instantiated and called as such:
 * TweetCounts* obj = new TweetCounts();
 * obj->recordTweet(tweetName,time);
 * vector<int> param_2 = obj->getTweetCountsPerFrequency(freq,tweetName,startTime,endTime);
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文