B商务搜索实习面试总结

10/21/2014
今天去面试某Du的商务搜索实习生,是一个学弟给内推的。面我的是一个校友,问题问的很细致,基本就是在给我上课(我的基础相当不好),总之收获颇丰。

面试流程

  1. 自我介绍
  2. 写一个单链表排序函数;如果单链表节点存放数据较大该如何处理
  3. Cpp vector 尾端插入元素复杂度,Java ArrayList 尾端插入元素复杂度
  4. Java ArrayList, LinkList, TreeList 有什么区别
  5. 已知商场30天的销售记录,预估第31天的营业额

我的基础差到只能问我这些问题。可惜基本没回答道他满意。

对应解读

1.自我介绍

自我介绍就不用说了,但我描述的让别人感觉似乎我在学校做的项目都是被迫的,这点不太好,下次注意

2.单链表排序

我写的是这样的:

void bubblesort(Node* head)
{
	Node* ptr = head;
	int isChanged = 1;
	int tempData = 0;
	while (isChanged == 1)
	{
		isChanged = 0;
		while (ptr != NULL && ptr->next != NULL)
		{
			if (ptr->data > ptr->next->data)
			{
				tempData = ptr->data;
				ptr->data = ptr->next->data;
				ptr->next->data = tempData;
				isChanged = 1;
			}
			ptr = ptr->next;
		}
		if (isChanged == 0)
		{
			break;
		}
		/*加上之后正确 ptr = head;*/
	}
}

回来运行测试了下,就完成了一遍冒泡。检查了下,发现内层循环结束,指针没回到头指针head处。修改之后,貌似是OK了。不知道算对么···

如果节点存放的数据较大,那么就交换链表的指向,就是逻辑上换个位置就行。

3.vector

vector 尾端插入元素复杂度是啥???我当时蒙住了,毕竟没怎么用过Cpp,想着如果是O(1)怎么可能问这个问题,就回答了不知道。回来查了维基百科,还真的是O(1)。给自己跪了Orz

vector的表现一如数据结构中的数组,允许随机存取(Random Access),以索引值(index)访问任一元素只要花费常数时间 O(1),在集合尾端增加或删除元素也是花费常数时间 O(1),若在vector集合中间增加或删除元素时间复杂度是线性时间 O(n),较为费时。虽然C++标准并没有规定实作方式,但大多数 vector 内部均使用动态数组方式实作。

4.Java的各种 List

这个我就直接说不会。平时就用到过 ArrayList,另外两个都没用过。

以下摘自http://josh-persistence.iteye.com/blog/1975956

ArrayList

  1. ArrayList基于数组方式实现,无容量的限制。
  2. ArrayList在执行插入元素时可能要扩容,在删除数组时并不会减少数组的容量(如希望相应的减少数组的容量,可以调用ArrayList的trimToSize()),在查找元素时需要遍历数组,对于非null的元素采取equals的方式寻找。
  3. ArrayList是非线程安全的。

LinkedList

  1. LinkedList基于双向链表机制实现。
  2. LinkedList在插入元素时,必须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历列表;在删除元素时,要遍历列表,找到要删除的元素,然后从列表上将此元素删除即可。
  3. LinkedList是非线程安全的。

TreeSet

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。

从LinkedList和ArrayList的区别来看,我们可容易的得出什么时候使用ArrayList,什么时候使用LinkedList:

  1. 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
  2. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

5.机器学习

我给他描述了一遍线性回归,很显然他要的不是这个单一的答案。当他问我代价函数到底表示什么,我就一直说是求得一个合适的theta,是的学习得到的曲线更符合想要的。总之就是吧线性回归的步骤都给他讲了一遍,最后还是他点到说求得的theta使得代价函数最小。同时告诫我以后看的时候自己动手画一画,把别人讲的消化掉。这点我确实没有做到。

总结

面试肯定是悲剧了,但他感觉人很好,等于是一直在给我指导。结束后他给了我一些建议:

  1. 把心态放低,端正学习的态度。
  2. 学好一门语言并熟练掌握,要明白你写的程序中,为什么用这个数据结构而不用同类的其他结构,相比之下有什么优缺点,各种操作的复杂度是什么,都要了然于胸。
  3. 离校招还有一段时间,可以在学校好好看看书。《算法导论》是要看的。
  4. 机器学习这方面,课程还继续跟着学,同时可以看看关于这方面的书,再有就是《概率论》、《最优化》,以及要了解一些分布式计算的内容(如Hadoop)。

感想

果然是深度不够,平常只会在各种API之间徘徊,确实要有一门核心技术作为支撑了。定下心,写程序多思考,再回归ACM刷题时代,看公开课的时候不用太急着拿证,一定要学到自己手里。

给自己一个目标,下次在有面试总结,上面出现的问题不能再有!时间还有,努力ing

posted @ 2014-10-23 21:32  sincerelywy  阅读(147)  评论(0)    收藏  举报