BD面试---一面

来源:互联网 发布:linux scp复制文件夹 编辑:程序博客网 时间:2024/04/29 17:19

下午三点零几分的样子手机响了,010的,那肯定就是面试了。上周HR就给我打电话告知呢,说是3点半,提前了20多分钟^_^。

先是让自我介绍,大致说了下研究生期间都主要干啥,本科又主要干啥。接着就是正题了:

1.对C++比较熟悉哈,那讲讲虚函数是如何实现的吧。大致讲了一下,虚指针,虚表。

2.memcpy和strcpy的区别。好久以前专门查过,strcpy以'\0'结束拷贝,而memcpy没有这个标志,让拷多少就拷多少。具体的我都忘了,所以现在再次查阅了下,完整的解释应该是:strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止,同时也要注意源串的大小不能大于目标串的大小,而且不能相交,要不然会出错的);而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符)。这个问题没回答完全,哎,一时没想起来。

3.快排,冒泡,堆排的区别。这个当时回答的也不明确,好多重要区别没说出来,说得不准确。再次整理下,完整解释:快排和冒泡都属于交换排序,就是两两比较待排序的码,并交换不满足顺序要求的那些对偶,直到不存在不满足顺序要求的对偶为止。

快排平均时间复杂度为O(nlogn),最坏情况下是待排序的码已经都满足顺序要求,而每次选择的基数都是最左边的那个数l,每次这个基数和其右边的所有数都进行一番比较,最后还放在原处l,接着快排递归处理l+1---n这个序列,所以时间复杂度为O(n^2)。快排属于不稳定排序,附加存储空间为O(1),其实如果要算递归调用函数的话,其附加空间应为O(logn)。

冒泡的平均时间复杂度为O(n^2),而如果待排序码已经有序,则只进行n-1次比较即可。冒泡属于稳定排序,附加存储空间为O(1)。

堆排是属于选择排序,第一趟在n个待排序码中选择出最大(小)的码单独放在一边,然后在剩余的n-1个里面选出次最大(小)的码放在一边,如此下去,直到全部码达到有序。堆排的时间复杂度为O(nlogn),是一种不稳定的排序,附加存储空间为O(1)。

4.开始难题了。一个计数器,以P的概率产生0,以1-P的概率产生1。现在要求利用该计数器设计一个函数,要求分别以1/2的概率产生0和1。这个题想半天没有思路。面试官就给提示了下,从相同概率着手。好一会后还是没思路。后面再次提示,终于想明白了。调用两次该计数器的结果有四种:

0 0    P*P, 0 1  P*(1-P) ,  1 0   (1-P)*P,  1 1 (1-P)*(1-P)            其中 0  1 和 1  0 的概率相等,所以就是如果产生的是 0  1 就输出 0(1),如果产生的是 1  0 就输出 1(0)。其他情况继续调用,知道是0 1 或者  1 0。

5.接着在4上扩展,利用该计数器设计一个函数,该函数以等概率产生1---n之间的数(1/n的概率产生)。这个题想了一会,算是有了思路,先设计一个变量r,初始化为1,调用n次4题设计的函数,然后r + (4题设计的函数输出的结果),最后r作为输出。后来想想这个时间复杂度太高了,应该是将n转换为二进制,然后调用4题设计的函数logn次,将每次的结果拼接起来,转换为十进制,作为输出。这样子就很快了。

5.接着就问了简历上的一些相关问题。先是让说实习的相关事宜,接着让解释下做的其中一个课题,然后是关于聚类的一个课题,附带问了KM,我也顺带说了KHM与KM之间的区别,然后再问了下对分类了解多少,把自己知道的说了下,应该是要先建模型的,根据模型进行分类,还说了KN的大致过程。

6.题出疑惑。问了下为什么面试这么晚,问了下如果二面的话是什么时候。说了下自己想做什么。

 

就这样子,整个过程持续到4点02分,希望能有下一面吧。^_^

原创粉丝点击