華為機試題:計算鏈路長度
題目描述
在資料鏈路中,每個裝置都有資料流入裝置和流出裝置,流入流出關係通過一個表格記錄,請根據給出的記錄表,計算出裝置所屬鏈路的最大長度(鏈路的節點個數)
輸入描述:
第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