• 华为机试题:计算链路长度


    题目描述

    在数据链路中,每个设备都有数据流入设备和流出设备,流入流出关系通过一个表格记录,请根据给出的记录表,计算出设备所属链路的最大长度(链路的节点个数)

    输入描述:

    第1行输入为关系记录的数量 N, N<=100
    第2行输入为待计算所属链路的最大长度的设备0
    从第3至N+2行输入为关系记录,每一行关系记录按照设备ID,流入设备ID,流出设备ID空格字符分隔。每个设备都有自己的关系记录

    输出描述:

    对于每组测试数据,输出0所属链路的最大长度

    用例1

    输入:

    4
    device1
    device1 device2 device3
    device2 null device1
    device3 device1 device4
    device4 device3 null

    输出:

    4

    用例说明:

    第一行数据4表示有4条数据关系记录。
    第二行数据device1表示需要计算device1的所属链路的最长长度。
    第三行device1 device2 device3:设备device1的流入设备有 device2,流出设备有deviec3。
    第四行device2 null device1:设备device2没有流入设备,流出设备有device1。
    第五行device3 device1 device4:设备device3的流入设备有 device1,流出设备有device4。
    第六行device4 device3 null:设备device4的流入设备有device3,没有流出设备。

    根据上述信息可以还原出一条链路关系:device2->device1->device3->device4
    注:当没有流入设备或者流出设备时,用 null 字符表示。

    用例2:

    输入:

    8
    d3
    d1 null d2
    d2 d1 d3
    d2 d1 d5
    d2 d1 d4
    d3 d2 null
    d4 d2 null
    d5 d2 d6
    d8 d5 null

    输出:

    3

    备注:

    一个设备可以属于多个链路,每个设备只有一个流入设备,但每个设备可以有多个流出设备,切各设备组成的链路不存在环路。

    解题代码:

    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int size = Integer.parseInt(scanner.nextLine());
            String deviceId = scanner.nextLine();
            String root = null;
            // 键为设备ID,值为流入设备
            Map<String, String> registry = new HashMap<>();
            for (int i = 0; i < size; i++) {
                String line = scanner.nextLine();
                String[] record = line.split(" ");
                if ("null".equals(record[1])) {
                    root = record[0];
                    registry.put(root, null);
                } else {
                    registry.put(record[0], record[1]);
                }
                // 终点设备
                if (!"null".equals(record[2])) {
                    registry.put(record[2], record[0]);
                }
            }
    
            Map<String, Integer> maxPathMap = maxPath(registry);
            System.out.println(maxPathMap.get(deviceId));
        }
    
        public static Map<String, Integer> maxPath(Map<String, String> path) {
            Map<String, Integer> result = new HashMap<>();
            Set<String> devices = path.keySet();
            for (String d : devices) {
                // 表示路径长度
                int length = 1;
                String front = d;
                Set<String> deviceInPath = new HashSet<>();
                deviceInPath.add(d);
                for(;;) {
                    front = path.get(front);
                    if (front == null) {
                        break;
                    }
                    deviceInPath.add(front);
                    length++;
                }
                // 更新路径中所有节点的最大路径
                Integer max;
                for (String s : deviceInPath) {
                    max = result.getOrDefault(s, length);
                    max = Math.max(max, length);
                    result.put(s, max);
                }
            }
            return result;
        }
    
    }
    

    自编用例:

    输入:

    1
    d1
    d1 null null
    

    输出

    1
    
  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/15376536.html
Copyright © 2020-2023  润新知