有道题List<Employee> source,需要查询
1、所有姓李的人
2、从source中排除行李的人
我问了是否可以使用LINQ,他说可以,于是乎作答如下:
1、var AllLi = source.Select(p => p.FirstName == "Li")
2、source = source.Except(AllLi);
很简单。然后他又说,如果不能用LINQ,排除姓李的该怎么做
作答如下:
var NoLi = List<Employee>(source.Count);
foreach(Employee e in source)
{
if(e.FirstName != "Li") NoLi.Add(e);
}
return NoLi;
很简单。他说这样效率不是低了吗?我说这样并没有使效率变低啊因为同是一次循环,所以时间复杂度仍然是O(n),只是空间增加了一个m,变成了n+m而已。
然后他又要求说仅用一次循环并且中间不许产生其他数组变量,该怎么做。
很可恶,要求怎么那么多!!当时我就愣了一下,因为平常上述方法就可以了,没去想别的东西,于是我就说我需要考虑下。过了不到半分钟他就说那这道题就这么算了。
面试后出来我用了不到三分钟就想到了解答,其实很简单,思路就是操作source,只是foreach中不能修改源所以我楞了下而已,实际上的解答代码就几行,如下:
int curIndex = 0;
while(curIndex < source.Length)
{
Employee e = source[curIndex];
if(e.FirstName == "Li") source.Remove(e);
else curIndex++;
}
可恶!究竟是他没给够我三分钟呢,还是我的水平太差了?想这个这么简单的东西是不是不用三分钟啊?思维有点定向了,脑中满是LINQ和使用temp了,并且我还认为这个是完成这种问题的标准解答,唉!我只有一年工作经验,不知各位认为是我的水平差了些呢,还是面试官太过于着急呢?各位又用了多少时间想出本题答案?
前面问的都是些简单的HTML和利用CSS做出效果等等简单的问题,就不说了。在此给出后面问的一些问题,都是敏捷设计模式的。虽然我都答出来了,但他似乎不是很满意,大家讨论下:
(*)你知道单一职责原则吗?为何需要使用单一职责,有何好处?
(*)怎么理解依赖倒置(DIP)?使用DIP有何好处?