2014阿里巴巴研发工程师暑期实习生面试经验

2014阿里巴巴研发工程师暑期实习生面试经验


Blog:  http://blog.csdn.net/u013011841

时间:2014年8月
出处:http://blog.csdn.net/u013011841/article/details/24438709
声明:欢迎指出错误


     先写个初稿,有空再改改。

         2014年4月24号,我报的是阿里巴巴的研发C++,在华工大学城校区旁边的华工大酒店。回头想想好像是报错了,应该投算法工程师的,悔不当初啊!因为简历写的是一些算法方面的东西,而面试官好像对这方面好像也不大熟悉的感觉,所以弄的还是有点尴尬。面试的地点是在3楼,里面有很多张桌子,像是大型相亲会一样的地方,一对一的面试,是一个很清瘦的小伙子。一开始先试做自我介绍,随便说了一些东西,面试官也没怎么听,就闲聊了一些学校啊什么的东西,问完就开始问我项目的事情。



问题1:对项目没有一个很好的总结

      我现在做的项目基本上就是属于机器学习啊,人工算法方面的东西,因为面试官也不是很懂,所以问了我这些东西在生活上有什么用途?稀里糊涂讲了半天没有想出来这个到底能用在哪个地方,用函数的角度去讲,面试官又说不行,最后只好坦白说实在找不到一个简单一点的例子来形容这个算法。

然后是做过的其他的项目可能也没有什么亮点,没有产生一些额外的加分点的,所以有机会的话可以做一些有特色的项目啊,做出一些亮点来吸引别人,然后再表达的好一些,让别人觉得你还挺牛逼的样子。



问题2:系统设计能力?

     此题考的应该是设计模式!

     问的第二个问题是一个球在这个墙壁里面撞来撞去,你用面向对象的语言去设计这个系统?


      这个问题回答的应该算还过的去吧,我当时就是设计了一个关于球的类,定义了一些私有成员数据,还有公有的成员函数,包括获取坐标,输出坐标,还有移动操作。面试官说不行,然后给提示说这个墙的呢?然后我又写了墙的类,有墙的建立,还有边界的处理,他就问下一个问题了。



问题3:数据结构题:在第i个结点后的单链表的一个插入操作? (限时5分钟)

      这个代码写的不是很好,差不多下面就是这样子,由于这个确实写的不是很好,可能有些超时


Status ListInsert(LinkList *L, int i, ElemType e)
{
	int j;
	LinkList p, s;
	p = *L;
	j = 1;
	while (p && j <= i)
	{
		p = p->next;
		++j;
	}
	if (!p || j > i+1)
		return ERROR;
	s = (LinkList)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}


       代码写的不是很熟练,写的也是比较乱,所以他直接就问我了是不是很久没有写代码了,让我给他讲了这具体的都是些什么意思。纠结的地方有二个地方,第一是说我写的这个好多类型都不是C里面的,让人摸不透到底是他不懂,还是他在考我?然后我就把链表的结构点的定义也讲给他听,说着说着又说到第二个点,是他问我这个指针怎么是这么用,我说这个是指向结构体的指针,两个人纠结了一会,讲着讲着就不知道在讲什么了,他就让我给他讲讲这个算法是怎么实现的,我就巴拉巴拉讲了一会就结束了这个问题。



问题4:算法题:挑选一个你最擅长的算法题写出来?(限时3分钟)

       这个是最坑爹的一个,当时听到这个的时候感觉还挺开心的,觉得准备的东西终于用上了,快速排序背了好长时间,而且各种优化版本,还有复杂度的推导,于是很自信的跟面试官说那就快速排序吧。面试官也乐了,说这个可是决定了你的生死哦。现在想想,当时是没有搞清楚状况吧,很嘚瑟的跟他说写的不好就不会选快速排序了,于是刷刷两分钟左右的时间把代码写了下来.


int Partition(SqList *L, int low, int high)
{
	int pivotkey;

	pivotkey = L->r[low];
	while (low<high)
	{
		while (low<high&&L->r[high] >= pivotkey)
			high--;
		swap(L, low, high);
		while (low<high&&L->r[low] <= pivotkey)
			low++;
		swap(L, low, high);
	}
	return low; 
}


void QSort(SqList *L, int low, int high)
{
	int pivot;
	if (low<high)
	{
		pivot = Partition(L, low, high);
		QSort(L, low, pivot - 1);
		QSort(L, pivot + 1, high);
	}
}


          出来之后就发现我错了,果断的被刷掉了,不知道是策略问题还是其他的问题吧,我一开始是想着先写一个基本的快速排序,他要是有要求再把优化的快速排序写出来。可是他看完之后都没有给我其他的机会,先让我讲讲这个partition是怎么个实现的,我讲了一会,然后重点来了,他很鄙夷的语气问了我你这里怎么会有三个while,当时就愣住了,解释说这个while只是判断边界,并没有因此增加复杂度。因为我看的是程杰的那本大话数据结构,很基础很简单的一本,所以可能写出来的代码没有啥特色,后来回来看了一下,清华大学严蔚敏教授写的那个版本也是这个,虽然程杰的有优化方法,但是感觉跟他要的点就完全不一样,后来看到算法导论上一个只有一个for循环的方法,不知道是不是他说的那种。

             后来想想也是,假设阿里巴巴有100亿条数据需要排序,那我写的那个比较挫的代码可能要1000个小时,可是他们要的是1个小时就能排好的方法,因此他们对效率的要求可能相当高。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值