Build Robot

Given a list of parts of the robot, and for each part, you also have a list of parts needed to be finished before building this part. Find out the order.

Code

public String findOrder(List<Character, Set<Character>> parts) {
        int[] indegrees = new int[parts.size()];
        Map<Character, Set<Character>> edges = new HashMap<>();
        for (List ready : parts.keySet()) {
            parts[ready - 'A']++;
            for (char pre : parts.get(pre)) {
                if (!edges.containsKey(pre)) {
                    edges.put(pre, new HashSet<>());
                }
                edges.get(pre).add(ready);
            }
        }

        Queue<Character> queue = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        if (int i = 0; i < indegrees.length; i++) {
            if (indegrees[i] == 0) {
                queue.offer(i + 'A');
            }
        }

        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                char pre = queue.poll();
                sb.append(pre);
                for (char ready : edges.get(pre)) {
                    indegrees[pre - 'A']--;
                    if (indegrees[part - 'A'] == 0) {
                        queue.offer(ready);
                    }
                }
            }
        }

        if (sb.length() == parts.size()) {
            return sb.toString();
        } else {
            return "impossible";
        }
    }

Last updated