Self Id After Parent Id
题目:
解题思路:
这道题是典型的拓扑排序,就是某些vertex必须在另外某些vertex之前。拓扑排序的话需要用到一个set和一个stack。link: https://www.youtube.com/watch?v=ddTC4Zovtbc&t=17s
代码:
给一组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 因为10是1的父id,所以10->200一定要在1->10的前面,如果没有父id关系的话就按id排就好了 函数是
List<Object> sortObject(List<Object> objects){} 另外父id一定比id大且给的数组元素不重复
给的是:1->10, 2->20, 3->30, 10->200, 20->100
排好应该得到:3->30, 10->200, 20->100, 1->10, 2->20 因为10是1的父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
Post a Comment