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);
    }
}
相关推荐
NiceCloud喜云11 小时前
海外云服务器怎么选?适用场景、价格和避坑经验总结
运维·服务器
名字还没想好☜11 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫11 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao11 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬12 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛12 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
daad77713 小时前
记录matlab状态机demo
java·网络·matlab
牡丹雅忻113 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
kaoa00013 小时前
Linux入门攻坚——84、网络虚拟化技术-1
linux·运维·服务器
学者猫头鹰13 小时前
Java 8 核心新特性
java