class Solution { public static int[] findOrder(int num, int[][] pre) { Node[] arr = new Node[num]; for (int i = 0; i < arr.length; i++) { arr[i] = new Node(); arr[i].val = i; } for (int i = 0; i < pre.length; i++) { arr[pre[i][0]].pre.add(pre[i][1]); } String[] str = print(arr).split(" "); if(str.length!=num)return new int[]{}; int [] ans = new int[str.length]; for(int i = 0 ; i< str.length ; i++) { ans[i] = Integer.parseInt(str[i]); } return ans; } public static String print(Node[] arr) { int len = arr.length; // 次数 int count = 1; StringBuffer sb = new StringBuffer(""); while (count++ <= len) { for (int i = 0; i < len; i++) { if (arr[i] != null) { Node temp = arr[i]; int val = temp.val; // 如果入度为0,则输出 if (temp.pre.size() == 0) { // 输出结果 sb.append(i + " "); arr[i] = null; // 从头遍历一遍 for (int j = 0; j < len; j++) { if (arr[j] != null) { // 小心remove索引而不是自己要的值 arr[j].pre.remove(val); } } } } } } return sb.toString(); } } class Node{ //没有考虑重复为问题 int val ; HashSet<Integer>pre = new HashSet<Integer>(); }