coding everyday

编程面试题 https://interview.codeplex.com

C++博客 首页 新随笔 联系 聚合 管理
  12 Posts :: 2 Stories :: 7 Comments :: 0 Trackbacks
#面试题#Facebook 用户都是双向的好友,a是b的好友,那么b一定是a的。给定一个用户列表,有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,每组内的用 户,互相都不是好友。如果能,请给出这个划分。原题见:题目

例子1:

用户:{1, 2, 3}

好友关系:1-2, 2-3

划分:{1,3} {2}


例子2:

用户{1,2,3,4}

好友关系:1-2, 2-3, 3-4,4-1

划分:{1, 3}{2, 4}


题目乍一看,感觉像是图连通的问题。细细品了下,貌似不是滴。。题目应该可以解读为有一个集合S,是否可以划分成2个子集A,B,这2个子集满足以下条件:
A∪B=S  <-- 划分为两组
A∩B={}空   <-- 每组内的用户互相不为好友

既然如此,那么我想应该很简单了,是不是?用2个set来表示子集A和B,一条一条关系处理,以例子2为例做个演练:
  1. 1-2,看下1或者2是否已经存在在A和B里面了,如果不存在,1放进A,2放进B里面
  2. 2-3,看到2已经在B里面了,先看下3是否也在B中了,如果在B中说明不存在2个集合,退出,否则把3放到A中即可
  3. 3-4,3在A中,看4是否在A中,若存在退出,否则放4在B中。
  4. 4-1,4在B中,1不在B中,并且1已经在A中,不需要继续放了。
以上第2步,为啥要看3是否在B中?这其实就是做交集的过程,如果存在说明已经存在交集了。以上步骤结束后,A中是{1,3},B中是{2,4},现在就剩下最后一步了,就是要看这2个子集的并集是不是就是原始集合即可。这个很简单,只要过一遍原始集合,看下是否存在一个既不在A中,也不在B中就可以了。

代码稍后更新。

posted on 2013-07-19 09:52 everyday 阅读(686) 评论(0)  编辑 收藏 引用 所属分类: Algorithm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理