InterviewPreparation
CS Interview preparation for non-CS students
新手零基础刷leetcode与编程面试准备
文章适用范围
关于刷题:
本文章是给时间不够(准备时间在2个月以内),基础薄弱(非CS本科)的人。请时间充裕,或CS科班出身的无视。
关于面试:
我只讲没在论坛/书上看人说过的一些小技巧
刷题前期准备
看完一些能用动画/视频图解算法的书/app/视频。对每种数据结构/算法,能清楚地运作一次。(比如随意一组数知道怎么样手动heap sort / priority sort一次 )
搜索的时候关键词 algorithms + illustrated / tutorial / visualisation
刷题
看视频
一上来不是去刷题,而是先看看一些youtube的视频/论坛。找那种,会告诉你正统做法怎么做的,解题步骤,思路是什么。
看看别人怎样从暴力解,到OK解,再到最优解,并且完成 follow up。
千万不要看那种,一上来,就说【这题很简单我们直接写代码】的。
搜索的时候直接youtube / 谷歌 那道题的题号 + 题目。
选题
很多人一上来就先一直做easy的题。个人推荐做最frequent的题。按照freq排序做头200题足够了。做到后面见一题会一题。
一开始不建议按tag刷题,因为看着tag是two pointers、hash map 你心里就知道这题该用什么思路了。一开始就按照freq的排序混着做,自己去想思路。心里多总结。
其他人的回答
每道题就算做出来了,也一定要看看讨论区的其他高分回到,一来我们还菜的时候想到的不一定是最优解,二则每一题多一些思路以后更加灵活。有时候follow up就是【这题你还有啥其他解法】。
题目里有【one-line solution】字样的新手可以不用点开了。
按tag精做
等到比较熟练了,(easy基本会,medium三成会)就开始按tag分类别做题,leetcode题目自带tag。
可以看着经典书籍cracking the coding interview做,不要被厚度吓到了,后大半本是题目的答案,前大半本有一定程度废话,千万不要被厚度吓到了。建议边看边刷。比如看完书上和hash table有关的,就去把hash table的题做了。
另外,这本书的作者,在youtube上是有视频的,有每个章节的内容的讲解。如果有需要,在github上有官方的,不同编程语言的版本cracking the coding interview。
按公司刷题
面具体公司的时候,去刷那个公司最freq的30题,中奖率是有的。这时候刷就不用真的去写了,看题然后看看自己心里有没有思路就行了。在leetcode/lintcode题库里就可以选具体公司。leetcode的explore还整理得蛮好的,它会具体到这题是谷歌的onsite还是phone还是campus。
心态上更多是看这个公司的出题喜好,而不是真的一定只要原题。
做题习惯
做题时养成笔头逻辑推理之后,再书写代码的习惯。一开始不要上来就写。
另外,平时养成开记事本写代码的习惯,不要依赖notebook/IDE。倒不是指不要依赖tab补全之类的,主要是不要依赖他们的纠错/报错。要做到记事本写代码一跑就bug free.
格式
不是科班出身的人经常不知道格式。
命名
函数、变量的命名规则要统一且规范。
另外,别人就算不看注释也能无障碍看懂代码。另外一定要写清楚这个函数/变量是什么。比如说,loop一个list的坐标点 ,新手就容易 for item in list_a ...
,别人完全不知道item
是啥,一定要 for point in point_list ...
诸如此类的别人看得懂的命名方式。
另外新手命名map/dic
也容易瞎命名。某个dic
,从A map 到B,这个dic 就可以命名为A_to_B
, 诸如此类。
注释 + 查input
写注释: 函数开头要写注释,把type和变量是啥写清楚
def two_sum(self, nums, target):
"""
:type nums: List[int] - a list of numbers that ...
:type target: int - the target number
:rtype: List[int] - a list of two numbers that ...
"""
查input:查input是否合法等,然后报错/扔异常,问问面试官要求
面试的时候,十有八九,写一次面试官就意会你懂了,就会说“我知道你懂了,后面的函数可以不写了注释 + check input了。”
白板排版 划重点
面试时,拿到白板/白纸就画条竖线。 把功能明确的代码写成函数,尤其是会被复用的,左侧写非常简洁明了的主函数,右侧写def 要用到的其他函数。 比如一上来,左侧先写:
def find_route(map):
find_neighours(...)
...
check_exit(...)
...
整个左侧简洁明了,思路清晰,面试官一看就知道我要干嘛——
我想找路径
找这个点的邻居哪个是路
...
查点是不是出口
...
然后,右侧一上来先写:
def find_neighours(...):
就这样空着
def check_exit(...):
就这样空着
并不急于去写里面的东西。 等和面试官确认左侧展现的思路他/她认可了,再去补右侧的函数。
千万不要所有东西都堆在主函数里,看起来就是 ——
我想找路径
看看这个点的上面
看看这个点的左面
看看这个点的右面
看看这个点的下面
...
看看这个点的坐标
这个坐标是不是地图边界
...
让人看着很乱,面试官理解就要很久。
良好的排版,可以防止
- 某个地方卡壳到最后都没说清楚整题思路
- 代码太多太杂影响面试官看思路
- 思路本来就错的,没提前沟通,写到后面没时间改。
99%的情况下,面试官不会让你真的把右边每个函数都写出来。他/她一般挑1-3个最重要的让我们写。无形中防止了,时间不够写不完代码。
画图讲思路
有时候题目非常复杂/非常绕,觉得讲不清楚就画图阐述思路。
真的不会
千万不要沉默,聊题,聊思路,面试官一定会给tips的。
如果面试官给完tips以后,你想到了另一个能work的思路,哪怕比面试官的更好,千万不要走,一定要按照面试官给的tips写完这题。不然面试官容易生气,觉得悟性不足。不要问我怎么知道的。
其他准备
内推
能内推就别网申。
小问题准备
除了大题,很多公司都会问一些小的tech问题。目的是看看熟练程度之类的。科班出身的人这些都是日常,很多人并不需要准备。但是零基础的人经常并没有实际操作过,是需要系统准备一下的。
去tutorial points看看会问什么小问题(如对比不同语言的gc之类, SVC 函数每个参数具体代表什么之类的)在tutorial points找interview question
https://www.tutorialspoint.com/java/java_interview_questions.htm
也可以直接谷歌搜"XX top interview questions" 。
我当时自己整理了700多个Q&A吧,很多都被问到了。
OS, database, git 与计算机网络
非CS本科的人学OS, database, git 与计算机网络是需要较长时间的。就算时间不足够也一定不能就此放弃还是要准备的。
首先,cracking the coding interview对应的部分看完。
另一个是搜"XX top interview questions", 准备好每个领域最常问的问题,至少top 30问题心里有数。
最后,平时自己刷题的代码就用git管理,一举两得。
tips for 新手: git不是github发明的。
argue
觉得自己表现没有问题,或者觉得面试官有问题,被刷了,可以去和HR argue的。有理有据的情况下,成功率不低。
比如,我谷歌一面argue成功因为面试官的英语我真的没有听懂。
Thank you letter + follow up
面试完之后立即发 Thank you letter,给HR和面试官都发。有个chrome的extension,叫 RocketReach,能找到非常多人的working email addr.
很久没回复就自己follow up 一下,客客气气地没关系的。
简历 & linkedin
CV + linkedin + cover letter一定要找外国人改。
CV改完挂上openCV, CVlibrary, monster等上。
linkedin和挂CV一定要搞好,全世界的猎头和HR都找你的,电话接到手软。
这期间千万不要漏接电话,说不定就是心仪的公司的。
注意背景调查
简历上每一笔经历,入职的时候,背景调查公司都是会细问入职时间和职位的。
所以,
- 没有人/银行流水/入职证明能证实的经历,尽量不写。虽然一般背景调查可以选择【我拒绝被调查这段经历】,但是尽量不要去试。
- 需要前雇主证明的话,提前打好招呼,客客气气地。
- 职位一定要写精确。笔者每段实习经历,都比较随意地填了software engineer,被背景调查公司要求书面说明,为什么他们调查结果,我的职位是intern,为什么和我写的software engineer不符合。令人非常焦虑。最后我现任雇主,出面表示不介意这个出入,背景调查公司才放过这个问题。
时间安排
申请的时候问清楚HR每一个环节要多久,做好时间上的安排,不要留下遗憾。是一个统筹安排的问题。不要因为心仪的公司申太迟而没法等待。
边面边学
初期可以申你本来就不想去的公司,不仅积累经验,有时候面试官人呢贼好,会手把手教你很多东西哦。
“来我考你一下..., 不会?” 掏出一个白板 “来,我教你哦...”