邻区对象:
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 分了 。
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 分了 。
这个地方不能理解
此消息通过 【CSDN论坛 Winform测试版】 回复!
这道题逻辑比较简单,不过考的是时间复杂度,不是空间复杂度。所以要求效率最快。
如果集合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,比之前的少很多。
//个人看法,不一定是最优的。