【Lintcode】997. Print Organization Chart

题目地址:

https://www.lintcode.com/problem/print-organization-chart/description

给定一个列表,每个元素是个字符串列表,每个列表代表一个员工,按照该员工姓名,上级姓名,职位和年份排列。上级为”NULL“代表该员工是最高层的员工,没有上级。题目保证公司员工按照上下级关系的结构是个树结构。要求返回一个列表,列表里含的是字符串,格式是其姓名、空格、左括号、职位、右括号、空格、年份,字符串之间的顺序是先序遍历整棵树。并且该树的同一层的员工按照姓名的字典序排序。

思路是DFS。先建立树结构,再进行DFS。这里建立树结构的时候,最好将每个员工包装成一个类,将其姓名、下级、职位和年份包装在类里。代码如下:

import java.util.*;

public class Solution {
    
    class Person implements Comparable<Person> {
        String name, pos, year;
        Set<Person> sub;
        
        public Person(String name) {
            this.name = name;
            // sub用TreeSet,保证下级按照字典序排序
            sub = new TreeSet<>();
        }
    
        @Override
        public int compareTo(Person p) {
            return name.compareTo(p.name);
        }
    }
    
    /**
     * @param relationship: the relationship
     * @return: the organization chart
     */
    public List<String> getOrganization(List<List<String>> relationship) {
        // Write your code here
        List<String> res = new ArrayList<>();
        Person root = buildTree(relationship);
        dfs(root, 0, res);
        return res;
    }
    
    private void dfs(Person cur, int level, List<String> res) {
        StringBuilder sb = new StringBuilder();
    
        sb.append("-".repeat(level)).append(cur.name).append(" (").append(cur.pos).append(") ").append(cur.year);
        res.add(sb.toString());
    
        for (Person sub : cur.sub) {
            dfs(sub, level + 1, res);
        }
    }
    
    private Person buildTree(List<List<String>> relationship) {
    	// 建立员工名和员工Person对象之间的映射关系
        Map<String, Person> map = new HashMap<>();
        // 存树根对应的Person
        Person root = null;
        for (List<String> relation : relationship) {
            String nameSub = relation.get(0), nameSup = relation.get(1);
            
            if ("NULL".equals(nameSup)) {
                root = map.getOrDefault(nameSub, new Person(relation.get(0)));
                root.pos = relation.get(2);
                root.year = relation.get(3);
                map.put(root.name, root);
                continue;
            }
            
            Person personSub = map.getOrDefault(nameSub, new Person(relation.get(0)));
            map.putIfAbsent(nameSub, personSub);
            personSub.pos = relation.get(2);
            personSub.year = relation.get(3);
            
            Person personSup = map.getOrDefault(nameSup, new Person(relation.get(1)));
            map.putIfAbsent(nameSup, personSup);
            
            personSup.sub.add(personSub);
        }
        
        return root;
    }
}

时空复杂度 O ( n l ) O(nl) O(nl) l l l代表每个Person对应的字符串长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值