邻区对象:
Public class Neighbor{
        Private Integer sourceCell;
        Private Integer destCell;
        Public Integer getsourceCell()
{
        Return sourceCell;
}
Publuic void setsourceCell(Integer sourceCell)
{
        this.sourceCell=sourceCell;
}
Public Integer getdestCell ()
{
        Return destCell;
}
Publuic void setdestCell (Integer destCell)
{
        this. destCell = destCell;
}
}
业务描述:
单向邻区:如果两个列表中存在一个sourceCell是n1 , destCell是n2的Neigbhor对象,并且在两个列表中不存在sourceCell是n2, destCell是n1的Neigbhor对象,则该Neigbhor对象就是简单邻区对象。
输入:
List<Neigbhor>innerNbr, List<Neigbhor>extNbr;
输出:
        打印出innerNbr和extNbr列表中所有单向邻区对象。
要求:当2个列表的数据量很大时,用最优的时间复杂度实现。
举例:
innerNbr对象
{1,2}
{1,3}
{4,6}
{2,1}
extNbr对象
{2,5}
{3,1}
{6,4}
打印结果:
4,6
2,5
6,1
整理邮件 发现这封邮件 当时是面试华为的一个外包项目的面试题 当时没做出来。
没分了 就100 分了 。

解决方案 »

  1.   

    单向邻区:如果两个列表中存在一个sourceCell是n1 , destCell是n2的Neigbhor对象,并且在两个列表中不存在sourceCell是n2, destCell是n1的Neigbhor对象,则该Neigbhor对象就是简单邻区对象。
     
    这个地方不能理解
      

  2.   

    看一下..
     此消息通过 【CSDN论坛 Winform测试版】 回复!
      

  3.   

    2个列表合并成一个集合,然后做个循环验证,把妹存在一个sourceCell是n1 , destCell是n2的Neigbhor对象,并且在两个列表中不存在sourceCell是n2, destCell是n1的Neigbhor对象关系的数据输出即可。
      

  4.   

    前提是我没理解错误。
    这道题逻辑比较简单,不过考的是时间复杂度,不是空间复杂度。所以要求效率最快。
    如果集合A的个数为m,集合B的个数为n。
    正向思维的循环次数是(m+n)*(m+n)次(等于m*m+2mn+n*n此)。
    还个思路,定义一个二维数组test,sourceCell和destCell当做两个坐标。循环集合A和集合B(m+n次),当给test[1][2]赋值(值随便)时检测一下test[1][2]和test[2][1]是否已经有值,如果有值,就把这两个地方赋值成特殊值。最后循环一边数组(m*n次)把不为空且不为特殊值的对象取出来,两个坐标就是结果。
    主要思路就是用二维数组的定位功能,省去循环判断是否存在{1,2}的过程。
    总共m+n+m*n,比之前的少很多。
    //个人看法,不一定是最优的。