Self Id After Parent Id

题目:

objects, 每个2个属性分id和父id。要求给这组objects排序保所有父id都排在id 的前面,如
的是:1->10, 2->20, 3->30, 10->200, 20->100
排好应该得到:3->30, 10->200, 20->100, 1->10, 2->20 101的父id,所以10->200一定要在1->10的前面,如果没有父id关系的就按id排就好了 函数是
List<Object> sortObject(List<Object> objects){} 另外父id一定比id大且的数元素不重复 

解题思路:
这道题是典型的拓扑排序,就是某些vertex必须在另外某些vertex之前。拓扑排序的话需要用到一个set和一个stack。link: https://www.youtube.com/watch?v=ddTC4Zovtbc&t=17s

代码:

public class SelfIdAfterParentId {

    static class Object{
        int selfId;
        int parentId;
        public Object(int selfId, int parentId){
            this.selfId = selfId;
            this.parentId = parentId;
        }
    }


    public Deque<Object> sortObject(List<Object> objects){
        Set<Object> visited = new HashSet<>();
        Deque<Object> stack = new ArrayDeque<>();
        Map<Object, List<Object>> graph = constructGraph(objects);
        for(Object vertex : graph.keySet()){
            if(visited.contains(vertex)){
                continue;
            }
            helper(graph, vertex, visited, stack);
        }
        return stack;
    }

    private void helper(Map<Object, List<Object>> graph, Object vertex, Set<Object> visited, Deque<Object> stack) {
        visited.add(vertex);
        for(Object child : graph.get(vertex)){
            if(visited.contains(child)){
                continue;
            }
            helper(graph, child, visited, stack);
        }
        stack.offerFirst(vertex);
    }

    private Map<Object, List<Object>> constructGraph(List<Object> objects){
        Map<Object, List<Object>> graph = new HashMap<>();
        for(Object object : objects){
            graph.put(object, new ArrayList<>());
        }
        for(Object object : objects){
            for(Object key : graph.keySet()){
                if(key.selfId == object.parentId){
                    graph.get(key).add(object);
                }
            }
        }
        return graph;
    }

    public static void main(String[] args){
        SelfIdAfterParentId selfIdAfterParentId = new SelfIdAfterParentId();
        Object o1 = new Object(1, 10);
        Object o2 = new Object(2, 20);
        Object o3 = new Object(3, 30);
        Object o4 = new Object(10, 200);
        Object o5 = new Object(20, 100);
        List<Object> input = new ArrayList<>();
        input.add(o1);
        input.add(o2);
        input.add(o3);
        input.add(o4);
        input.add(o5);
        Deque<Object> rst = selfIdAfterParentId.sortObject(input);
        print(rst);
    }

    private static void print(Deque<Object> rst) {
        for(Object object : rst){
            System.out.println(object.selfId + "->" + object.parentId);
        }
    }
}

Comments

Popular Posts