1. 程式人生 > 其它 >華為機試題:計算鏈路長度

華為機試題:計算鏈路長度

題目描述

在資料鏈路中,每個裝置都有資料流入裝置和流出裝置,流入流出關係通過一個表格記錄,請根據給出的記錄表,計算出裝置所屬鏈路的最大長度(鏈路的節點個數)

輸入描述:

第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