阿里四面总结

持续一周的阿里面试终于结束了,一共面了四次,最终止步于boss面上。但是在面试的过程中也学到了不少东西,对自己的优点弱点也了解了不少,总结一下,算是为下面的面试做铺垫了。

一面 (1h)#

一面是个操着扶蓝口音的大哥,一听就比较实在。

首先问了项目的问题,主要的思路是这个项目是做什么的,有什么挑战,你的贡献是什么。具体的问题如下:

  • 说一个项目
  • 主要挑战
  • 项目里面具体的工作是什么
  • 算法是指什么算法
  • 算法是为了解决什么问题
  • 为什么要优化
  • 算法的时间复杂度是
  • 之前的时间和点是多少
  • 按照什么样的规则缩小点

基本上我说的论文里面的东西面试官都能懂,并且问的也比较细了。

另外问了C++STL的一些问题:

  • 对C++里面的STL了解吗
  • C++里面怎么做内存管理?
  • 忘了delete怎么避免这种情况?
  • 怎么保证new了就会delete,如果你要实现你会怎么实现?-》在析构函数里进行delete
  • 如果把这个指针复制给另一个指针,析构的时候应该怎么实现-》对复制操符重载(变成深拷贝)
  • 如果不能拷贝?-》引用计数
  • 还有其他方式吗?有什么缺点-》多增加字段,存储空间大
  • 如果有多线程同时读同一个指针?-》加锁
  • 对引用计数判断的时候要加锁吗?为什么?怎么实现?在锁里面释放指针?会有什么问题?能不能优化?因为delete操作很重。有没有方法在锁的外面delete?
  • A成员变量里面有B,B里面有A,会怎样?-》引用计数多加1,在拷贝构造函数判断是不是相同。如果相等直接返回,这样会不会有别的问题?

然后让我实现一下上面说的指针。

后来我查了一下相关的知识,发现我说的基本上和auto_ptr以及shared_ptr的思路基本类似。改日看一下智能指针的源码,写一下文档。

另外还问了一些其他的问题

  • 平时有没有看其他开源项目?技术上的东西?

我问面试官的问题:

C++搜索业务?搜索引擎开发,算法打造算法平台。高性能高并发大数据架构

二面 (45min)#

二面的面试官说话声音很好听,人也很耐心。

面试主要分为三部分,首先介绍了一下自己的团队,然后出了一个算法题,最后让我介绍一下自己的项目经历等等。

题目:

有一些排好序的整数,可能会有重复,找出这些数至少出现过一半的整数。

  1. 如何定义这个函数的接口?
  2. 加入数据有1个亿,应该怎样优化。

一开始我把这个题想成了之前看过的一道题,那道题是找出“出现过一半以上”的整数。那道题的思路主要有下面几种:

  1. 如果没有排序,需要遍历+统计,大概O(nlongn+n)
  2. 如果是有序的,找到N/2处的数判断一下
  3. 利用hash,大概O(N)
  4. 设置一个value值,一个count值,假如value和前一个一样,count++,否则count–。返回count>0时的value值。

但是最后一个方法只针对“一半以上”有用,比如13344,count值分别是1,0,1,0,1,但是实际上没有满足要求的数。

面试官提醒了我一下,然后我调整了一下思路,重新想了一下。但是还是回答得不全。大概思路还是利用2.

然后我问面试官如果是他们会怎么做,他很耐心地给我解答了这个问题。首先要考虑一些细节,比如数据的奇偶性,怎么取N/2处的数据,如果结果有多个值怎么办。另外在二分查找的时候也可以使用多线程。有时候数据很大可能装不进内存,可能需要分割等等。

三面,交叉面 (30min)#

三面电话打得很突然,听说是阿里的p9, 是ICBU的。
这一面问得比较广泛,但是不是很深入。

  • 科研
  • 金融项目(项目用了几个线程?怎么决定的?为什么需要三个月?)
  • web压测(为什么要做?)
  • 数据库的范式,left join
  • 平衡二叉树
  • 指针和引用的区别

四面,boss面

  • 科研
  • 数据库对A B做了索引,如何查找A=X&B=Y的数据
  • 为什么文件用B+树不用平衡二叉树
  • 假设有十几个G的数据,但是内存只有500M,如何排序

https://www.cnblogs.com/aspwebchh/p/6652855.html
https://bbs.csdn.net/topics/390985501

我的缺点:算法题有时候会卡壳,卡得时间很长,就很尴尬。。。接下来还是要多看基础,注重算法题的思路和细节。