怎样准备面试中的手写算法
# 怎样准备面试中的手写算法
在程序员找工作的过程中考察算法是一个必不可少的环节,尤其是校招面试,应届生如果没有啥项目经验,面试官只能通过手写算法来了解你的基本功。下面讲一讲准备面试中的手写算法需要注意的几点。
# 1. 确定刷题的语言
编程语言只是一个工具,不要太纠结,每一门语言都是相通的,不过这里还是推荐主流的语言,后端尽量选择c++/java/go,测试开发尽量选择python,前端尽量选择js。一旦选择了语言,一定要对它的语法,常用api,内存机制,优缺点等烂熟于心。
比如你在手写算法的时候想使用优先队列,是没办法现场去查api文档的,如果你对优先队列常用的api不熟悉,即使你思路再清晰也是写不出来的。
有些面试官喜欢出一些设计题,比如让你实现一个字典树,或者实现一个简单的C++的智能指针,这个时候就看语言的掌握情况了,如果你连构造函数,析构函数的定义都写不出来,那基本就凉凉。
# 2. 刷多少题才够?
刷题量因人而异,我见过一道题没刷过,项目经历比较亮眼,直接拿到阿里星offer和字节ssp offer的。当然也遇到过刷了近千道题,最后折在一道快速排序上的。
刷题数量不是目的,刷题的目的是掌握常见的考点。
常用的数据结构: 数组、字符串、链表、二叉树、图、前缀树、集合、映射、栈、队列、堆。
常用的解题方法: 递归、迭代、二分法、回溯、贪心、动态规划、位运算、双指针、模拟、拓扑排序、桶排序、单调栈、深度优先搜索、广度优先搜索。
对于求职而言掌握上面这些已经足够了,有更多的时间可以去把基础打牢,去参加一些有意义的开源项目或大企业举行的比赛,或者在自己的研究方向做出一点成就,不必执着于刷题。
# 3. 刷完需要达到什么效果?
形成自己的代码风格,代码一定要整洁,变量命名要让人一看就知道是啥意思,代码流程清晰明了,小的功能可以抽出来封装成一个单独的函数。
常用的数据结构和常用的解题方法必须是要完全掌握的。时空复杂度要会分析,常用数据结构的查找、插入、删除的时空复杂度要牢记。
常见的排序算法实现及其复杂度分析必须要手到擒来。快排,堆排等也是面试的高频。
简单的测试用例需要会构造,代码写完了,面试官让你自测一下,这个时候如果不会了,那就太可惜了。
要会调试代码,使用OJ上的编辑器写代码最常用的调试方法就是使用语言自带的打印函数把关键逻辑点的变量打印出来,然后构造一个简单的测试用例,根据打印的结果分析代码逻辑是否正确。平时利用本地IDE写代码,不理解的函数也可以把关键逻辑打印出来,比如你对递归的流程感到比较疑惑,你可以在递归结束的条件和递归函数的入口加一些打印,通过分析这些打印,递归的整个过程就很清晰了。
有些用c++刷题的同学要注意对内存的操作,申请的内存用完要记得释放,不要使用未分配内存的指针,c++中定义一个指针,如果不初始化为NULL指针,它是随机指向一块内存的,这个时候如果对它指向的内存操作,会发生未知的错误,在一些大型项目中可能会导致整个服务的崩溃。良好的内存操作习惯也会让面试官觉得你写代码很严谨。
# 4. 多跟面试官交流
面试过程中多和面试官交流,题目描述不清可以多追问一下,如果遇到没有思路的问题可以让面试官提示一下,让面试官看到你在积极处理问题。如果一看没思路,直接放弃,基本就凉凉了。
# 5. 多注意细节
手写算法只是面试的一部分,有时候虽然代码你写出来了,面试官问的其他问题也都答出来了,你以为胜券在握,但是最后挂掉了。这可能是很小的一个细节决定的,比如写代码边界条件考虑不周或者在回答一些问题的时候表达的不自信,回答问题一定不要用“可能如何如何”这样的词语,不懂的问题也不要乱说,可以有根据的推理,但是胡乱说是大忌。多向你懂的领域引导面试官,让他发现你更多的闪光点。平时可以找一些已经工作有经验的学长学姐进行模拟面试,多找下自己的不足。