1348 推文计数【区间】

一家社交媒体公司正试图通过分析特定时间段内出现的推文数量来监控其网站上的活动。这些时间段可以根据特定的频率( 每分钟每小时每一天 )划分为更小的 时间段

例如,周期 [10,10000] (以 为单位)将被划分为以下频率的 时间块 :

  • 分钟 (60秒 块): [10,69], [70,129], [130,189], ..., [9970,10000]
  • 小时 (3600秒 块):[10,3609], [3610,7209], [7210,10000]
  • (86400秒 块): [10,10000]

注意,最后一个块可能比指定频率的块大小更短,并且总是以时间段的结束时间结束(在上面的示例中为 10000 )。

设计和实现一个API来帮助公司进行分析。

实现 TweetCounts 类:

  • TweetCounts() 初始化 TweetCounts 对象。
  • 存储记录时间的 tweetName (以秒为单位)。
  • List<integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) 返回一个整数列表,表示给定时间 [startTime, endTime] (单位秒)和频率频率中,每个 时间块 中带有 tweetNametweet 的数量。
    • freq"minute""hour""day" 中的一个,分别表示 每分钟每小时每一天 的频率。

示例:

复制代码
输入:
["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]]

输出:
[null,null,null,null,[2],[2,1],null,[4]]

解释:
TweetCounts tweetCounts = new TweetCounts();
tweetCounts.recordTweet("tweet3", 0);
tweetCounts.recordTweet("tweet3", 60);
tweetCounts.recordTweet("tweet3", 10);                             // "tweet3" 发布推文的时间分别是 0, 10 和 60 。
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // 返回 [2]。统计频率是每分钟(60 秒),因此只有一个有效时间间隔 [0,60> - > 2 条推文。
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // 返回 [2,1]。统计频率是每分钟(60 秒),因此有两个有效时间间隔 1) [0,60> - > 2 条推文,和 2) [60,61> - > 1 条推文。 
tweetCounts.recordTweet("tweet3", 120);                            // "tweet3" 发布推文的时间分别是 0, 10, 60 和 120 。
tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210);  // 返回 [4]。统计频率是每小时(3600 秒),因此只有一个有效时间间隔 [0,211> - > 4 条推文。

提示:

同时考虑 recordTweet 和 getTweetCountsPerFrequency,最多有 10000 次操作。

0 <= time, startTime, endTime <= 10^9

0 <= endTime - startTime <= 10^4

cpp 复制代码
typedef struct {
    char name[50];
    int time[10000];
    int size;
    UT_hash_handle hh;
} TweetCounts;

TweetCounts *g_hash = NULL;

int getInterVal(char *freq) {
    if (strcmp("minute", freq) == 0) {
        return 60;
    } else if (strcmp("hour", freq) == 0) {
        return 3600;
    } else {
        return 86400;
    }
}

int min(int timeA, int timeB) {
    return timeA < timeB ? timeA : timeB;
}

int getInterValCount(char *freq, int startTime, int endTime) {
    int interVal = getInterVal(freq);
    int interValCount =  (endTime - startTime) / interVal;
    return interValCount + 1;
}

TweetCounts* tweetCountsCreate() {
    return g_hash;
}

void tweetCountsRecordTweet(TweetCounts* obj, char * tweetName, int time) {
    TweetCounts *s = NULL;
    HASH_FIND_STR(g_hash, tweetName, s);
    if (s == NULL) {
        s = (TweetCounts *)malloc(sizeof(TweetCounts));
        strcpy(s->name, tweetName);
        s->size = 0;
        s->time[(s->size)++] = time;
        HASH_ADD_STR(g_hash, name, s);
    } else {
        HASH_DEL(g_hash, s);
        s->time[(s->size)++] = time;
        HASH_ADD_STR(g_hash, name, s);
    }
}

int* tweetCountsGetTweetCountsPerFrequency(TweetCounts* obj, char * freq, char * tweetName, int startTime, int endTime, int* retSize) {
    int *result = (int *)malloc(sizeof(int) * 10000);
    int interVal = getInterVal(freq);
    TweetCounts *s = NULL;
    *retSize = 0;
    int interValCount = getInterValCount(freq, startTime, endTime);
    HASH_FIND_STR(g_hash, tweetName, s);
    if (s != NULL) {
        for (int k = 0; k < interValCount; k++) {
            int count = 0;
            for (int i = 0; i <= s->size; i++) {
                if (s->time[i] >= (startTime + k * interVal) && s->time[i] < min(startTime + (k + 1) * interVal, endTime + 1)) {
                    count++;
                }
            }
            result[(*retSize)++] = count;
        }
    }
    return result;
}

void tweetCountsFree(TweetCounts* obj) {
    TweetCounts *current, *tmp;
    HASH_ITER(hh, g_hash, current, tmp) {
        HASH_DEL(g_hash, current);
        free(current);
    }
}
相关推荐
NE_STOP2 小时前
SpringBoot+shiro+jwt前后端分离鉴权
java
小当家.1052 小时前
JVM/八股详解(下部):垃圾收集、JVM 调优与类加载机制
java·jvm·面试
szm02252 小时前
Java并发
java·开发语言
天“码”行空2 小时前
java的设计模式-----------单例类
java·开发语言·设计模式
0***m8222 小时前
Java性能优化实战技术文章大纲性能优化的基本原则
java·开发语言·性能优化
芒克芒克2 小时前
JVM性能监控
java·jvm
小李独爱秋2 小时前
计算机网络经典问题透视:可以通过哪些方案改造互联网,使互联网能够适合于传送音频/视频数据?
运维·服务器·网络协议·计算机网络·音视频
行稳方能走远2 小时前
Android java 学习笔记3
android·java