背景
在之前我就已经面完了阿里CBU部门的前两面,过后一面面试官打电话过来说需要做一下笔试,时长30分钟作用,一道题(可能是之前面试没有问我算法题吧)。
笔试是昨天(3.11)在阿里的伯乐系统上进行的,面试官先打电话过来。这里比较尴尬的是我那时候坐在电脑前水群,打字的时候不挂掉了第一次的电话...好在面试官马上接着打了过来。然后我们在打电话的同时他给我发了笔试链接,进去后才贴题目。这里大致描述一下题目吧,记的不是很清楚了。。
这里说几个伯乐系统的点:
- 不支持自动补全,换句话说,如果不是有代码高亮那你就是在用记事本写代码
- 不能编译运行
- 面试官给我说的视频可开可不开
题目描述
给n个字符串,格式类似“stringA, stringB”,表示这两个字符串之间有某种关系,关系是可以传递的,最后给m个询问“stringA? stringB”,让判断stringA是否和stringB有关系。也就是说,如果a和b有关系,b和c有关系的话,那a和c也是有关系的。
我的解题过程
猜测这可能是道leetcode原题,但是我没怎么做leetcode(总共不超过40道)所以没见过~看到这个题的第一印象:哎哟喂这不是个传递闭包吗~直接floyd往上怼,把每个字符串映射成一个点,a和b有关系的话就是a点和b点之间有边相连,最后用邻接矩阵存图(单纯的懒。因为笔试题第一重点是思维的正确性,第二点就是速度。),最后跑了个floyd就差不多写完了。大概耗时貌似在几分钟的样子。
写完之后面试官就让我说思想和时间复杂度,我说这个问题可以扩展成图的可达路径,只需要把最短路改改就行,因为我这里用的floyd所以时间复杂度是O(),最短路的最低时间复杂度能达到O(
),但是那个需要借助堆,写起来比较麻烦我就没写。这里用到的floyd是基于动态规划的思想去实现的,然后blabla了一下动态规划和floyd。面试官听完给我说我想的复杂了,如果不用可达路径的这种方式应该怎么处理,大概30S左右,想到了用并查集去做这个题(并查集
,查询时间复杂度O(1),这里因为需要处理输入的关系所以我觉得这已经是最优解了)。然后blabla了一堆并查集,还说了一下
按秩合并和路径压缩,分析了一波时间复杂度。因为并查集的时间复杂度是通过摊还分析得到的,最终值渐进曲线是个反阿克曼函数[1],百万的时候只有4左右,所以一般认为并查集的查询时间复杂度是O(1),然后让我大概写了下。大概1分钟左右写完(并查集代码很短的,路径压缩3行,合并4行)。面试官就没说什么了。然后还问我有没有其他的解法,想了想说可以DFS然后打标记,其实和并查集是一样的思想只不过换了种实现方式。
需要注意的是,我平常用C++写算法题比较多(比较有洁癖,不喜欢用Java写算法,写起来太麻烦了)所以这次面试我是用C++写的,后来面试官问我能不能通过Java里的某种数据结构解决这个问题,这一块没有想到比较好的容器类,就说不知道了。
一点点经验
- 笔试的时候,别管最优解,优先目标是先在能想到的最低复杂度的情况下解题,解不了题哪怕事先想好了各种优化也没用
- 速度,速度,速度。
- 最好能想到多种解法,同时能够分析、类比、引申每个解法所涉及到的周边算法与数据结构
以上经验均为个人臆想,诸位看官自己把握就好~
后记
今天(3.12)面试官加我微信并恭喜我通过了笔试,但是后面还有三轮面试(真难。。)分别是主管 + boss + HR。
在《看完祝你拿offer》写完后其实我还有很多想要分享的,我自己总结的面试经验和技巧,但是目前阿里这边还没有结果,所以打算在凉凉(或者是拿到offer)后再依据我面CBU的经历写一下第二版,届时会发布在我的公众号bestsort中,希望大家多多关注呀~
参考资料
[1]反阿克曼函数: https://baike.baidu.com/item/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B0/10988285?fr=aladdin
本文使用 mdnice 排版