图片说明

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>();

}