快毕业了,想要找个工作,简单记录一下有些变态的小米的面试经历。

之前我也面试过两家,中兴和海康威视。简单说一下这两家,之后再奔主题。

1. 中兴技术面试比较水,我报的是python开发。四个面试官,基本没问什么技术问题(对的,这就是中兴技术面试:)。主要问我会什么,做过啥项目,用python能做什么企业级项目。我说我会C++/C/python。python并不能做什么企业级项目(当时没想通,现在想想python做原型开发很好)。之后就没啥,直接把我打发走了,总共才十多分钟。

2. 海康面试也比较水。问我数据库的事务,new和new nothrow,用没用过MFC(我当然说没用过,现在谁还用这玩意),我说我用过QT(实际上是pyQT)。之后还问了许多人际关系上的问题,我基本一个都答不上来。有一个令我印象深刻,如果你和别人合作完成一个项目,项目交接时出了bug,对方一口咬定是你的错,你怎么办?我吱吱呜呜半天答不上来,现在要我说,我就给他一个大耳刮子,教教对方为人处世之道。总时间也就半小时多一些。

3. 小米面试含金量十足。不出意外我应该是挂了。一共两轮,两个不同类型的面试官,一轮要一小时左右,两轮都要纸上写代码,给我最大的感触就是问得特别深,是越来越深,直到你答不出来。

第一轮问了我STL的一些数据结构,其内部实现。我说了map是红黑树,unordered_map是hash表,之后我不小心说到hash表最常见的实现就是一个链表数组,链表是为了处理冲突。于是又问我hash表处理冲突的方式,也难不倒我。再问让我写一个hash表存储用户的图片,大概要多少位hash值才能尽可能没冲突。我大概算了一下。下一个问题是while(1) sleep(x);这里x大概要多少秒(可小数)才能使cpu忙碌。大家估计一下我心理阴影面积。然后看我操作系统内部了解不多,又问了一堆。(这就是为什么我们应该好好读<<深入理解计算机系统>>)我答得十分糟糕。之后让我写一个链表反转,我感觉有点诧异,想不到这玩意还真这么容易考到。诧异是诧异,没花我多长时间就搞定一个O(n)时间O(1)空间的链表反转了。又让我说如果要实现一个lrucache,怎么实现?我记得教材上有说过用栈,我就直接说栈,面试官反问了我一堆问题,后来我又说用链表,不过可能空间消耗比较大,面试官问我为什么,我说有个指针域(我也是蠢哭),然后就直接打发我走了。

本来我以为我没机会了,想不到一轮面试官给面子,让我到了二轮。

一上来,看见我简历上一个项目写了tfidf,就问我其是什么,我大概说了是频率和逆向频率的综合,又要我给出精确定义。我放弃(不太确定)。虽然我不久前刚看过定义,但当时没怎么仔细思考,毕竟sklearn里都有现成实现。之后让我写一个singleton,这玩意当然难不倒我。写完后又要我写一个线程安全的版本,我用了锁,但他说开销太大。我继续放弃(我印象中确实有的,但是比较底层,我对这种底层的东西没啥兴趣,要是有兴趣,一面也不会那么惨了),并反问他怎么办,他说了一个check twice(但我之后上网没找到)。之后问我拓扑排序(当然难不倒我)和java线程模型,这里我十分可笑,竟然把可重入锁说成自旋锁(自旋锁是lock后并不会让此线程立刻放弃cpu,而是等待一会;可重入锁是同一个线程可以多次获得)。又让我写二叉树后序的迭代版本,我压根没写过,只看过一次,那次看的实现还特别复杂,最惨的是,房间里另一对面试的有些影响我,心想这下出事了。磨磨蹭蹭写出了一个版本,面试官一看就否决了,我仔细一看,确实有问题,不过加上两个标记还是成功搞定。之后问了我要是去了小米想做什么,我十分可笑,说我想做比较酷的事(正常情况我是不会这么说的,我真正想法是做有趣的事,考虑到是小米),又问我做过什么酷的事,我答不出来,随口说了个装linux系统,使用cli,顿时感觉自己low爆了,还不如说在android上装linux呢!还问我哪方面比较薄弱,我当然是说计算机图形学了。之后说了我一些缺点,比如有点油(tfidf惹的货),知识面广但都不深。数据结构是不错(可能是我简历上写了解B树和红黑树),但算法不行(笔试最后两题,都只能给出差强人意的答案,不够极致(原话))。之后就把我打发走了,事后我还觉得有些希望。但这么多天过去了,越想越觉得没戏。

感觉自己还是太弱,还得多读书,多写代码,来年春招再投。

 

update 2017/10/19/22:00

 

check twice我大概知道是什么了。

原先代码是(这啥语言也不是,无需深究,达意即可):

lock
if not instance
    instance = something
endif
unlock
return instance

check twice后是:

if not instance
    lock
    if not instance
        instance = something
    endif
    unlock
endif
return instance

这我倒是很早以前见过,不过没想到面试官指的是这个。这可以一定程度上提高效率。注意,instance请为volatile,否者gcc可能会优化,第一次检查instance前将其存入寄存器,然后检查两次,导致多线程间竞争。

另外,小米笔试最后一题简答分两小题。都是关于字符串查找,在主串中找子串。第一小题字符可重复使用,但字串中字符需按顺序在主串中出现,大概某天早上,当时我给出一种暴力解法,某天早上,不知为何我想起这题,突然发觉这题其实相当简单,只要对子串第一个字符找在主串的第一次出现即可,再在剩下的字符递归使用此方法,因为若是后面的出现符合,前面的出现必然也符合。第二小题中子串中字符可以不按序在主串中出现,而且主串中字符可以重复使用。我竟然没做出来,我也是挺蠢的:(。只要将主串字符存入字典,然后对子串每个字符查找字典即可。

posted on 2017-09-26 00:42  algchthewor  阅读(17474)  评论(2编辑  收藏  举报