昨天看到有个说小米的面试题,朋友网,今天试着写了一下,请大家过目:
/**
*
*/
package com.bus.cxming.group;
import java.util.HashSet;
import java.util.Set;
/**
* @author lenovo
*
*/
public class Group
{
private Set<String> realationShipSet = new HashSet<String>();
public Set<String> getRealationShipSet()
{
return realationShipSet;
}
public void setRealationShipSet(Set<String> realationShipSet)
{
this.realationShipSet = realationShipSet;
}
private String firstChild;
public String getFirstChild()
{
return firstChild;
}
public void setFirstChild(String firstChild)
{
this.firstChild = firstChild;
}
public String getLastChild()
{
return lastChild;
}
public void setLastChild(String lastChild)
{
this.lastChild = lastChild;
}
private String lastChild;
public boolean equals(Object obj)
{
if(obj instanceof Group )
{
Group objGroup = (Group)obj;
return firstChild.equals(objGroup.getFirstChild()) && lastChild.equals(objGroup.getLastChild());
}
return false;
}
public int hashCode()
{
return firstChild.hashCode() + lastChild.hashCode();
}
public boolean isContains(Group group)
{
if(this.firstChild.equals(group.getFirstChild())
|| this.lastChild.equals(group.getLastChild())
|| this.firstChild.equals(group.getLastChild())
|| this.lastChild.equals(group.getFirstChild())
|| realationShipSet.contains(group.getFirstChild())
|| realationShipSet.contains(group.getLastChild()))
{
return true;
}
return false;
}
public void addFriend(Group group)
{
realationShipSet.add(this.firstChild);
realationShipSet.add(this.lastChild);
realationShipSet.add(group.getFirstChild());
realationShipSet.add(group.getLastChild());
}
public String toString()
{
StringBuffer sb = new StringBuffer();
for(String str : realationShipSet)
{
sb.append(str);
}
return sb.toString();
}
}
抽象出一个group类,有个属性HashSet,防止出现重复的数据,有个方法isContains(),判断是否是朋友,
/**
*
*/
package com.bus.cxming.group.ruleBS;
import java.util.List;
import com.bus.cxming.group.Group;
/**
* @author lenovo
*
*/
public interface GroupRuleBS
{
List<Group> convertArrayToList(String[][] friendArray);
void findGroup(List<Group> groupList);
}
有一个接口提供将数组转换成Group对象和找朋友的方法,我们看一下他的实现:
/**
*
*/
package com.bus.cxming.group.ruleBSImpl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.bus.cxming.group.Group;
import com.bus.cxming.group.ruleBS.GroupRuleBS;
/**
* @author lenovo
*
*/
public class GroupRuleBSImpl implements GroupRuleBS
{
private List<Group> groupResult = new ArrayList<Group>();
public List<Group> getGroupResult()
{
return groupResult;
}
@Override
public List<Group> convertArrayToList(String[][] friendArray)
{
List<Group> everyGroupList = new ArrayList<Group>();
Group group = null;
for(int i =0,len = friendArray.length ;i<len;i++)
{
group = new Group();
group.setFirstChild(friendArray[i][0]);
group.setLastChild(friendArray[i][1]);
everyGroupList.add(group);
}
return everyGroupList;
}
@Override
public void findGroup(List<Group> groupList)
{
Group group = groupList.get(0);
List<Integer> indexList = new ArrayList<Integer>();
List<Group> leftGroupList = findFriends(group, groupList, indexList);
if(!isEmpty(leftGroupList))
{
findGroup(leftGroupList);
}
}
private List<Group> findFriends(Group group,List<Group> groupList,List<Integer> indexList)
{
if(!isEmpty(indexList))
{
List<Group> newGroupList = new ArrayList<Group>();
for(Integer i : indexList)
{
newGroupList.add(groupList.get(i));
}
groupList.removeAll(newGroupList);
}
indexList.clear();
for(int i = 0 ,len= groupList.size();i<len;i++)
{
if(group.isContains(groupList.get(i)))
{
group.addFriend(groupList.get(i));
indexList.add(i);
}
}
if(!isEmpty(indexList))
{
findFriends(group,groupList,indexList);
}
else
{
groupResult.add(group);
return groupList;
}
return groupList;
}
private boolean isEmpty(Collection<?> col)
{
return col == null || col.isEmpty();
}
}
思路相信大家看一下就知道了,主要思路还是递归,运用集合的一些方法,其中的一些方法是没有必要的,比如isEmpty()
,这个方法在CollectionUnits中提供了。
下面看一下测试类:
/**
*
*/
package com.bus.cxming.group.test;
import java.util.List;
import com.bus.cxming.group.Group;
import com.bus.cxming.group.ruleBSImpl.GroupRuleBSImpl;
/**
* @author lenovo
*
*/
public class GroupTest
{
/**
* @param args
*/
public static void main(String[] args)
{
String[][] friendArray={{"1","2"},{"2","3"},{"4","5"},{"6","7"},{"5","6"},{"4","3"}};
GroupRuleBSImpl groupRuleBSImpl = new GroupRuleBSImpl();
List<Group> groupList = groupRuleBSImpl.convertArrayToList(friendArray);
groupRuleBSImpl.findGroup(groupList);
List<Group> resultGroupList = groupRuleBSImpl.getGroupResult();
for(Group group :resultGroupList )
{
System.out.println(group);
}
}
}
结果大家可以试验一下,我这边简单的测试应该是没有问题的,欢迎大家来挑刺。