先介绍下背景,我本科专业是硬件转软件方面,所以一开始算法基础比较差,没有做过系统设计,为了能得到好的面试机会,我一直都有努力准备,还在网上关注了各种能提高编程能力的攻略,我觉得打好基础的前提是要找到优质的学习资源,这样才能事半功倍,切忌在网上搜一些质量参差不齐的题去练习,有的连答案都不知道对不对,更别提对面试有帮助了。
我对比了几家刷题的网站,最后选了Lintcode(http://www.lintcode.com/)。题目基本上涵盖了所有IT公司面试会面到的算法题,推荐给想刷题的小伙伴们,建议用这个网站的伙伴们好好利用它的筛选功能,这样做你的知识结构能得到系统的梳理,按照难度、还有算法数据结构的类别来源去做,还有按照公司的分类。这些标签都清晰的标在每道题上,一目了然,话说一个IT属性的刷题网站界面做的这么美观我也是很服气。
扯远了,接下来说说我当时是怎么去小米面试的,作为一个米粉,给小米投递简历的时候还是小小激动了下,没想到第二天下午就收到了面试短信。
一面面试官看起来比较好说话,简单自我介绍了一下,就开始问项目经历中的细节,我觉得他问的很细,之前有面经上说小米会对项目经历深挖,幸好我有做准备,看来项目经历他们很重视啊。然后是写代码,矩形里写满了数字,给一个写了1的点,返回周围用1能联通区域的大小。我是用树做的。还有一道题是两个已序数组A,B,将两个数组进行归并,并将结果存放在数组B中,B足够大。例如A={1,3,5},B={2,3,5},结果B={1,2,3,4,5,6}。这一题比较简单。感觉一面沟通的挺顺畅的。
没多久接到了二面通知,我是比较爱纠结的一个人,通过一面反而又高兴又患得患失,怕进不了小米,毕竟技术岗,而且我是后面自学提高的,不过后来想想自己这么久以来刷的题也不是白刷的。二面的题目大概是这样的,一个数组中有100w个整数,这些整数的范围时1~99999,要求打印出重复的数字。这道题我当时没答出来。然后是一道二分查找的题,在一定精度内求根号n,n>=1。
三面印象最深的是在白板上写代码,感觉很紧张,因为一举一动都有人在看。三面太紧张了,忘了题目的细节了。。就记得问了链表的各种经典问题判断环相交结点等,然后是判断一个不规则多边形一个点是在多边形内还是外。还问了操作系统线程状态图线程进程区别虚拟内存cpu调度cache替换算法等。计算机网络OSITCP/IP三次握手四次握手,我答了之后面试官又反复追问我,问的很细。
能到三面我已经很开心了,总体感觉,小米的技术岗很重视算法和思路。技术岗我投了很多,面试也参加了好几波,之前一直在刷的Lintcode给了我很大的信心,面试时看到考察的题和知识点自己熟悉,那感觉超级棒,建议大家刷题还是要贵精不贵多,优质的算法题吃透一道可以顶你做很多道题了,那题要怎么吃透呢?我的办法可能比较笨,但是很有效!!就是对比优质的答案,去看自己差在哪里,思考怎么改进。为了找到好答案我也是搜罗了好久,最后一直反复用的就是下面这个这个查参考答案的网站了(http://www.jiuzhang.com/solutions),除了比较全以外,还因为它每道题代码行数都是最少的,简洁易懂,毕竟你如果代码写得太复杂了相信面试官也不会想和你共事的。里面有一些答案真的不错,我都直接当模板套到各种题目中,比如quick sort的答案。
因为我之前也参考了很多前辈的面经,所以也把自己记得的题写下来分享给有需要的人,怕自己忘记求职路上做的努力,记录下我的刷题和编程进阶之路哈哈,攒人品攒人品!
原文地址:http://12799252.blog.51cto.com/12789252/1923414