注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 火烈猴19 于 2019-8-22 10:46 编辑
给一系列比赛结果,例如“a beats b”, “b beat c”,“c beat d”;输出最终排名,这个例子是abcd,算是alien dictionary的变形。
不存在circle,例如“d beats a”。然后问了time and space complexity,还有会用什么样的test case去测试。
先上代码
- public class GetGameRank {
- public static void main(String[] args) {
- // write your code here
- String[] test1 = new String[]{"a beat b", "b beat c", "c beat e"};
- getOrder(test1).forEach(x -> System.out.print(x + " ")); //a b c e
- System.out.println();
- String[] test2 = new String[]{"a beat b", "a beat c"};
- getOrder(test2).forEach(x -> System.out.print(x + " ")); //a b c OR a c b
- System.out.println();
- System.out.println(getOrder(null).size() == 0);
- String[] test3 = new String[]{"a beat b", "b beat c", "c beat e", "e beat f", "e beat d", "d beat k"}; // a b c e d k f
- getOrder(test3).forEach(x -> System.out.print(x + " ")); //a b c e
- System.out.println();
- }
- public static List<String> getOrder(String[] games) {
- LinkedList<String> res = new LinkedList<>();
- if (games == null || games.length == 0) return res;
- Map<String, Integer> inDegree = new HashMap<>();
- Map<String, List<String>> graph = new HashMap<>();
- for (String game : games) {
- String[] team = game.split(" beat ");
- inDegree.put(team[1], inDegree.getOrDefault(team[1], 0));
- inDegree.put(team[0], inDegree.getOrDefault(team[0], 0) + 1);
- graph.computeIfAbsent(team[1], x -> new ArrayList<>()).add(team[0]);
- }
- Queue<String> queue = new LinkedList<>();
- Iterator<Map.Entry<String, Integer>> iterator = inDegree.entrySet().iterator();
- while (iterator.hasNext()) {
- Map.Entry<String, Integer> entry = iterator.next();
- if (entry.getValue() == 0) {
- queue.offer(entry.getKey());
- iterator.remove();
- }
- }
- while (!queue.isEmpty()) {
- String curr = queue.poll();
- List<String> next = graph.get(curr);
- res.addFirst(curr);
- if (next == null || next.size() == 0) continue;
- for (String n : next) {
- inDegree.put(n, inDegree.get(n) - 1);
- if (inDegree.get(n) == 0) {
- inDegree.remove(n);
- queue.offer(n);
- }
- }
- }
- return res;
- }
- }
复制代码
首先看到这种题 一个压着一个 第一个想到的就是topological sort (拓扑排序)
首先我们要将这个String 进行拆分
每个String的格式基本都是
用 String[] team = game.split(" beat "); 来进行拆分成两个队伍
拓扑这里不是我为了展现代码风骚来装逼才使用 iterator. 因为使用for loop来循环这个map 然后遇到indegree为0的entry 然后remove掉这个entry会导致concurrentModificationException
Iterator.remove()不会抛出ConcurrentModificationException,因为这是在迭代时修改集合的允许方式.
面试的时候记得避坑!
- Iterator<Map.Entry<String, Integer>> iterator = inDegree.entrySet().iterator();
- while (iterator.hasNext()) {
- Map.Entry<String, Integer> entry = iterator.next();
- if (entry.getValue() == 0) {
- queue.offer(entry.getKey());
- iterator.remove();
- }
- }
复制代码
这个我就不仔讲了 详情大家感兴趣可以去网上搜搜看
|