华为OD机试真题-API集群负载统计(详细解析)

华为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;
    }
}

解题思路:

  1. 统计热点信息:首先需要对给定的访问历史日志进行统计,记录每个API地址的访问频次。可以使用字典(HashMap)来实现这个功能,以API地址作为键,访问频次作为值,初始值为0。遍历每一条日志,将对应API地址的频次加1。

  2. 查询给定层级上关键字出现的频次:根据给定的层级L和关键字,在统计完的热点信息中进行查询。遍历热点信息字典的键,对每个键进行处理,首先判断键的层级是否与给定的层级L相同,如果相同则判断关键字与键是否完全匹配,如果匹配则累加频次。最后输出累加的频次即可。

华为OD机试真题-学生重新排队是一个典的编程问题,下面是问题和解决路: 问题描述: 有n个学生站成一排,每个学生都有一个独一无二身份ID。现在给定一个初始的学生排列顺序,以及一系列的交换操作,交换操作表示将两个学生的位置行交换。请你编写一个算法,输出最终的学生排列顺序。 解决思路: 这个问题可以使用数组来表示学生的排列顺序。首先,我们需要根据初始的学生排列顺序构建一个映射表,将每个学生的ID与其在数组中的位置对应起来。然后,我们按照给定的交换操作,更新映射表中学生的位置信息。最后,根据更新后的映射表,构建最终的学生排列顺序。 具体步骤如下: 1. 构建映射表:遍历初始的学生排列顺序,将每个学生的ID与其在数组中的位置对应起来,可以使用哈希表来实现。 2. 执行交换操作:按照给定的交换操作,更新映射表中学生的位置信息。 3. 构建最终的学生排列顺序:根据更新后的映射表,构建最终的学生排列顺序。 下面是一个示例代码,用于解决这个问题: ```python def rearrange_students(initial_order, swap_operations): # 构建映射表 mapping = {} for i, student_id in enumerate(initial_order): mapping[student_id] = i # 执行交换操作 for swap in swap_operations: student1, student2 = swap mapping[student1], mapping[student2] = mapping[student2], mapping[student1] # 构建最终的学生排列顺序 final_order = [0] * len(initial_order) for student_id, position in mapping.items(): final_order[position] = student_id return final_order ``` 使用上述代码,你可以通过传入初始的学生排列顺序和交换操作,得到最终的学生排列顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值