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);
    }
}
相关推荐
松☆11 分钟前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
编码者卢布32 分钟前
【App Service】Java应用上传文件功能部署在App Service Windows上报错 413 Payload Too Large
java·开发语言·windows
q行1 小时前
Spring概述(含单例设计模式和工厂设计模式)
java·spring
2501_927773071 小时前
uboot挂载
linux·运维·服务器
好好研究2 小时前
SpringBoot扩展SpringMVC
java·spring boot·spring·servlet·filter·listener
毕设源码-郭学长2 小时前
【开题答辩全过程】以 高校项目团队管理网站为例,包含答辩的问题和答案
java
Tim风声(网络工程师)2 小时前
防火墙-长链接、介绍作用
运维·服务器·网络
多来哈米2 小时前
openclaw在Windows部署
windows·openclaw
视觉AI2 小时前
【踩坑实录】Windows ICS 共享网络下,国产化盒子 SSH 连接异常的完整分析
网络·windows·ssh