今天下午只有两个面试官,一个是面软件开发的,一个是面算法的。
我去到的时候3点30分,一个华师的研究生师兄和一个华工的霸王面同学在等,就跟他们聊了一下。
4点45分才轮到我。
面试官先让我自我介绍,我从第三句起就开始说我喜欢算法,最后说到ACM。然后那个面试官就问我ACM比赛中印象最深的是哪几道题,我就说了那道11倍数还有打球的两道水题。然后他就根据笔试试题上面的问题来问我了。基本上都是先让我重新说一下我的思路,然后再根据我的思路来提问题。
1.假设路由器中有n条系统路由,每个路由条目由目标IP和子网掩码组成,现在需要转发网络的数据,请设计一个高效的路由寻找算法。
他另外提问的是:如何在路由器存储的那么多路由地址中查找到要转发的地址?最终我说的方法是用一个平衡二叉树进行查找,没办法,我对查找没研究,只是上午看哈希函数时不小心看到了平衡二叉树。
2.Web Cache(网页内容查找),要把出现最多的网页的内容存在内存中,如果查不到内容,则放到磁盘里,如果磁盘满了,则把冷网页淘汰掉。请设计一个算法。
答案:设计一个计数器,每使用一次就自增1,当磁盘到达一定量时,把一定的计数器最小的网页从磁盘删去。
他另外提问的问题是:如何查找到某一个网页的Url?也还是类似上面的查找问题。不过看我没怎么主动回答,他也没有深问。
3.请设计一方案,尽可能短在10GB源串(数据保存在硬盘中)寻找某模式串(大小4KB)的最大匹配,在开始模式匹配前,可以对10GB数据进行分析处理,中间的分析数据可以存放在100MB左右的内存内。
他问我对这道题有没有什么想法(我试卷没做,因为只需要三道做2道就好)。这个我暂时想不出来,我就跟他说,暂时没有思路,除非让我多想一下。不过他还是问下一个问题了。
二:算法基础题
1.有a,b,c,d,e五个袋子里面装了26个玻璃球,没有空的也没有相同玻璃球数量的袋子,已知道a+e,b+c,c+d都超过了11个玻璃球,而a+c小于11个玻璃球,请问有多少种可能的由小到大的组合?(例如1,3,5,7,10,但是1,5,3,7,10不是正确的组合)。解题空有6个空,但不一定都要填。
答:(1)1,3,4,8,10
(2)1,2,3,9,11
(3)2,3,4,8,9
(4)1,2,4,9,10
这道题他居然以为是我以前做过的,汗死,天大的耻辱啊。我再给他讲了一下我的思路,看他才有点相信我是真的第一次做的样子。
2.假设Hash函数是随机的,在n个桶中插入m个元素后平均占用多少个桶?(用数学表达式)
他跟我说了这道题的重大意义,他说这是一个评判该哈希函数好坏的一个依据,我自己讲了哈希函数的基本意义。
3.字符串匹配,例如,T=abcabaabcabac,P=abaa,则匹配位是3,请用伪代码写一下算法,并分析时间复杂度,看看是否可以再进一步优化。
for(int i=0;i<T.length,i++)
{for(j=le;j<P.lenght,j++)
if(T[i]==P[j]) {le++;flag=i;break;}
else{le=0;break;}
if(le>P.length) printf("%d",flag-le);}
他跟我讨论了,最终他举了个例子证明了我这个算法有错误,而且介绍了几个算法让我回去研究,例如KMP算法,BM算法。
4.已知道多边形的各个节点,这些节点连成了这个多边形,如何判断某一个点是否在这个多边形内呢?
这道他居然没问。。。
5.有两堆球,每堆都有10个,每个都标有重量,请设计算法重新分配这两堆球,使得两堆球的总重量之差最小。
一旦选了一堆球,另一堆球就定下来了。每个球有选或者不选两个状态,也就是两个分支,产生一棵二叉树,对其进行动态规划,可利用A*算法为每个节点算一个H函数。
我基本就是按照上面写的回答他。
6.有1001个球,两人轮流拿,每次只能拿1、2或者4个,谁拿了最后的一次就算谁输,假设是你先拿,请问你有把握获胜么?如果有,你该怎么拿,如果没有,为什么?
这道题他也以为我之前做过,汗死,我只能快速的把我的思路讲给听。
最后他看我的简历问我问题,例如做过的那个项目啊,不过由于那个项目跟算法的不太相关,他也只是稍微问了一下下。
由于之前提到平衡二叉树,他就问我一个非平衡二叉树如何变成平衡二叉树,我就把上午看到的说了出来,看来是正确的。
他又问了FOpen这个库函数在处理字符和二进制时有什么区别?
最后问了一个判断两个单链是否有交接的问题,要求用O(n)的复杂度,由于不太明白这道题具体是怎样的,我说了几个方法他都反驳掉我的了,最终我向他请教怎么做,他用一个O(n^2)的算法跟我说明了这道题,当然他说有O(n)的算法的。。。
最后他问了下我对于他们公司的其他工作有没有兴趣,例如前台,后台,设备啊等等什么的,我说了有,并说明了原因,他纠正了我对于一些工作的认识。
经过30分钟的面试后,终于结束了,感觉这次算是一次很正规的了,没有太多的不懂,觉得自己比上次进步了,呵呵,这两天要等通知,无论如何,下次要加油了。早点找好工作。
我去到的时候3点30分,一个华师的研究生师兄和一个华工的霸王面同学在等,就跟他们聊了一下。
4点45分才轮到我。
面试官先让我自我介绍,我从第三句起就开始说我喜欢算法,最后说到ACM。然后那个面试官就问我ACM比赛中印象最深的是哪几道题,我就说了那道11倍数还有打球的两道水题。然后他就根据笔试试题上面的问题来问我了。基本上都是先让我重新说一下我的思路,然后再根据我的思路来提问题。
1.假设路由器中有n条系统路由,每个路由条目由目标IP和子网掩码组成,现在需要转发网络的数据,请设计一个高效的路由寻找算法。
他另外提问的是:如何在路由器存储的那么多路由地址中查找到要转发的地址?最终我说的方法是用一个平衡二叉树进行查找,没办法,我对查找没研究,只是上午看哈希函数时不小心看到了平衡二叉树。
2.Web Cache(网页内容查找),要把出现最多的网页的内容存在内存中,如果查不到内容,则放到磁盘里,如果磁盘满了,则把冷网页淘汰掉。请设计一个算法。
答案:设计一个计数器,每使用一次就自增1,当磁盘到达一定量时,把一定的计数器最小的网页从磁盘删去。
他另外提问的问题是:如何查找到某一个网页的Url?也还是类似上面的查找问题。不过看我没怎么主动回答,他也没有深问。
3.请设计一方案,尽可能短在10GB源串(数据保存在硬盘中)寻找某模式串(大小4KB)的最大匹配,在开始模式匹配前,可以对10GB数据进行分析处理,中间的分析数据可以存放在100MB左右的内存内。
他问我对这道题有没有什么想法(我试卷没做,因为只需要三道做2道就好)。这个我暂时想不出来,我就跟他说,暂时没有思路,除非让我多想一下。不过他还是问下一个问题了。
二:算法基础题
1.有a,b,c,d,e五个袋子里面装了26个玻璃球,没有空的也没有相同玻璃球数量的袋子,已知道a+e,b+c,c+d都超过了11个玻璃球,而a+c小于11个玻璃球,请问有多少种可能的由小到大的组合?(例如1,3,5,7,10,但是1,5,3,7,10不是正确的组合)。解题空有6个空,但不一定都要填。
答:(1)1,3,4,8,10
(2)1,2,3,9,11
(3)2,3,4,8,9
(4)1,2,4,9,10
这道题他居然以为是我以前做过的,汗死,天大的耻辱啊。我再给他讲了一下我的思路,看他才有点相信我是真的第一次做的样子。
2.假设Hash函数是随机的,在n个桶中插入m个元素后平均占用多少个桶?(用数学表达式)
他跟我说了这道题的重大意义,他说这是一个评判该哈希函数好坏的一个依据,我自己讲了哈希函数的基本意义。
3.字符串匹配,例如,T=abcabaabcabac,P=abaa,则匹配位是3,请用伪代码写一下算法,并分析时间复杂度,看看是否可以再进一步优化。
for(int i=0;i<T.length,i++)
{for(j=le;j<P.lenght,j++)
if(T[i]==P[j]) {le++;flag=i;break;}
else{le=0;break;}
if(le>P.length) printf("%d",flag-le);}
他跟我讨论了,最终他举了个例子证明了我这个算法有错误,而且介绍了几个算法让我回去研究,例如KMP算法,BM算法。
4.已知道多边形的各个节点,这些节点连成了这个多边形,如何判断某一个点是否在这个多边形内呢?
这道他居然没问。。。
5.有两堆球,每堆都有10个,每个都标有重量,请设计算法重新分配这两堆球,使得两堆球的总重量之差最小。
一旦选了一堆球,另一堆球就定下来了。每个球有选或者不选两个状态,也就是两个分支,产生一棵二叉树,对其进行动态规划,可利用A*算法为每个节点算一个H函数。
我基本就是按照上面写的回答他。
6.有1001个球,两人轮流拿,每次只能拿1、2或者4个,谁拿了最后的一次就算谁输,假设是你先拿,请问你有把握获胜么?如果有,你该怎么拿,如果没有,为什么?
这道题他也以为我之前做过,汗死,我只能快速的把我的思路讲给听。
最后他看我的简历问我问题,例如做过的那个项目啊,不过由于那个项目跟算法的不太相关,他也只是稍微问了一下下。
由于之前提到平衡二叉树,他就问我一个非平衡二叉树如何变成平衡二叉树,我就把上午看到的说了出来,看来是正确的。
他又问了FOpen这个库函数在处理字符和二进制时有什么区别?
最后问了一个判断两个单链是否有交接的问题,要求用O(n)的复杂度,由于不太明白这道题具体是怎样的,我说了几个方法他都反驳掉我的了,最终我向他请教怎么做,他用一个O(n^2)的算法跟我说明了这道题,当然他说有O(n)的算法的。。。
最后他问了下我对于他们公司的其他工作有没有兴趣,例如前台,后台,设备啊等等什么的,我说了有,并说明了原因,他纠正了我对于一些工作的认识。
经过30分钟的面试后,终于结束了,感觉这次算是一次很正规的了,没有太多的不懂,觉得自己比上次进步了,呵呵,这两天要等通知,无论如何,下次要加油了。早点找好工作。