华为OD机试真题-API集群负载统计
题目描述:
某个产品的RESTfulAPI集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。RESTful API的由多个层级构成,层级之间使用/连接,如/A/B/C/D这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0次表示,实现这个功能。
输入描述:
第一行为N,表示访问历史日志的条数,0<N<100.
接下来N行,每一行为一个RESTfulAPI的URL地址,约束地址中仅包含英文字母和连接符/,最大层级为10,每层级字符串最大长度为10。最后一行为层级L和要查询的关键字。
输出描述:
输出给定层级上,关键字出现的频次,使用完全匹配方式(大小写敏感)。
Java代码实现
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class To1 {
public static void main(String[] args) {
// 创建一个 Scanner 对象以读取用户输入
Scanner scanner = new Scanner(System.in);
// 读取输入的 API 访问日志数据的行数
int N = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
// 创建一个 HashMap 用于存储 API 地址及其出现次数
Map<String, Integer> apiTrafficMap = new HashMap<>();
// 读取并统计每个 API 地址出现的次数
for (int i = 0; i < N; i++) {
String url = scanner.nextLine();
apiTrafficMap.put(url, apiTrafficMap.getOrDefault(url, 0) + 1);
}
// 读取用户输入的查询层级和关键字
String[] input = scanner.nextLine().split(" ");
int level = Integer.parseInt(input[0]);
String keyword = input[1];
// 调用函数获取给定层级上关键字出现的频次
int frequency = getFrequency(apiTrafficMap, level, keyword);
// 输出给定层级上用户指定关键字出现的频次
System.out.println(frequency);
// 关闭 Scanner 对象
scanner.close();
}
// 函数:统计给定层级上关键字出现的频次
private static int getFrequency(Map<String, Integer> apiTrafficMap, int level, String keyword) {
int frequency = 0;
for (String api : apiTrafficMap.keySet()) {
String[] levels = api.split("/");
if (levels.length >= level + 1) {
if (levels[level].equals(keyword)) {
frequency += apiTrafficMap.get(api);
}
}
}
return frequency;
}
}
解题思路:
统计热点信息:首先需要对给定的访问历史日志进行统计,记录每个API地址的访问频次。可以使用字典(HashMap)来实现这个功能,以API地址作为键,访问频次作为值,初始值为0。遍历每一条日志,将对应API地址的频次加1。
查询给定层级上关键字出现的频次:根据给定的层级L和关键字,在统计完的热点信息中进行查询。遍历热点信息字典的键,对每个键进行处理,首先判断键的层级是否与给定的层级L相同,如果相同则判断关键字与键是否完全匹配,如果匹配则累加频次。最后输出累加的频次即可。