题目描述
某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。
RESTful API是由多个层级构成,层级之间使用 / 连接,如 /A/B/C/D 这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。
现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0表示,实现这个功能。
输入描述
第一行为N,表示访问历史日志的条数,0 < N ≤ 100。
接下来N行,每一行为一个RESTful API的URL地址,约束地址中仅包含英文字母和连接符 / ,最大层级为10,每层级字符串最大长度为10。
最后一行为层级L和要查询的关键字。
输出描述
输出给定层级上,关键字出现的频次,使用完全匹配方式(大小写敏感)。
用例
输入 5
/huawei/computing/no/one
/huawei/computing
/huawei
/huawei/cloud/no/one
/huawei/wireless/no/one
2 computing
输出 2
说明 在第二层级上,computing出现了2次,因此输出2
输入 5
/huawei/computing/no/one
/huawei/computing
/huawei
/huawei/cloud/no/one
/huawei/wireless/no/one
4 two
输出 0
说明 存在第四层级的URL上,没有出现two,因此频次是0
题目解析
本题应该就是一个逻辑模拟题,以及考察集合的应用。
本题的难度主要在于数据结构的定义,我们需要按照下图所示方式,对各层级的关键字进行统计
[
{}, // 层级0
{"huawei": 5}, // 层级1
{"computing": 2,"cloud": 1,"wireless": 1}, // 层级2
{"no": 3}, // 层级3
{"one": 3} // 层级4
]
外层是一个数组(数组索引就是层级号),数组元素是一个map结构(key是关键字,val是关键字在对应层级出现次数)
我们按照这种数据结构收集各条日志URL的组成关键字,就能快速的找到指定层级(通过数组索引)下的指定关键字(通过map结构的key)的出现频次(map结构的val)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEVEL 10
#define MAX_WOERD_LEN 10
#define MAX_URL 100
typedef struct{
int words[MAX_LEVEL][MAX_WOERD_LEN+1];//key,存储每个层级的关键词
int counts[MAX_LEVEL];//val,count 数组存储每个层级关键词出现的次数。
}URL_INFO;
int main(){
int N;
int level;
char key[MAX_WOERD_LEN+1];
scanf("%d",&N);
URL_INFO urls[MAX_URL];
int count=0;
for(int i=0;i<N;i++){
char url[1024];
scanf("%s",url);
char *p=strtok(url,"/");//使用 strtok() 函数将 url 字符串按照斜杠 / 进行分割。
//strtok() 函数会返回第一个分割出来的子字符串,并将其存储在 p 指针变量中。
int j=0;
while(p!=NULL){
strncpy(urls[i].words[j],p,MAX_WOERD_LEN);
urls[i].words[j][MAX_WOERD_LEN] ='\0';
urls[i].counts[j]++;
p=strtok(NULL,"/");//当第一个参数为 NULL 时,strtok() 函数会继续使用上一次调用时保存的字符串进行分割。
j++;
}
}
scanf("%d %s",&level,key);
for(int i=0;i<N;i++){
if(strcmp(urls[i].words[level-1],key)==0)
count++;
}
printf("%d",count);
}