拓扑排序

小米公司内部每个员工都会有一个专属的工作邮箱,邮箱的前缀是员工姓名的拼音全拼,例如张强的邮箱是zhangqiang@xiaomi.com,但同时公司里有很多同名的人,为了避免大家相互之间发错邮件,工程师们想了个规则来解决这个问题,即在这些同命人中,入职最早的邮箱前缀为姓名的拼音全拼,第二个入职的邮箱前缀为姓名的拼音全拼后面加“_a”,第三个入职的为姓名的拼音全拼后面加“_b”,以次类推,请按这个规则,如果公司里同时有3位名叫张强的员工,则他们的邮箱分别是zhangqiang@xiaomi.com,zhangqiang_a@xiaomi.com,zhangqiang_b@xiaomi.com...邮箱前缀是员工在公司里的重要标识之一,问题来了:现在小米要举行一次全员野外拉练活动,要求所有员工必须排成一队出去,并且,有的员工要求他必须排在某人的前面或后面,作为组织者的你,收到这样的需求之后,如何给出一个让每个人都满意的排队方式呢?
Java:
1
2
3
4
5
6
7
8
9
10
11
class RequestItem
{
     public String member;
     public boolean standFront;  //true表示要排在这个人的前面,false表示要排在这个人的后面
}
class Request
{
     public String owner;     //那个人提出的要求
     List<RequestItem> requestItems;     //他要排在哪些人的前面,哪些人的后面
}
List<String> getValidOrder(List<String>allMembers, List<Request> requests);
allMembers就是所有员工的邮箱前缀,requests是一些人的排队要求。小米公司现有几千名员工,每个人最多有10个排队要求(要排在一个人的前面或者后面算一个排队要求),也有人没有什么要求。现在你的任务是完成上面的getValidOrder函数,如果有合法的排队序列,那么返回其中任何一个。否则返回null。


假设有n个员工。
选用数据结构,map[n][n]。
1、其中map[i][j]=1代表i在j的前面,=0代表前后位置,=-1带表在后面。若出现已经=-1的情况下,在后面又要求=1,会形成环,则返回null。。
2、这样就形成了一个图,然后进行拓扑排序即可。先找出所有入度为0的点,放在前面,然后去掉这些点和相应的边.如此得到最终结果。

欢迎找出问题!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值