Day1 - Algorithms by Hand in Interview

Day1 - 技术面中手撕算法

1. 语言的选择

  • 我选择C++作为我的主开发语言Python作为辅助开发语言。你也可以选择自己喜欢的。

  • 这需要我对C++的语法,常用API,内存机制,优缺点等烂熟于心。你也同样。

  • 比如在手写算法的时候想使用优先队列,是没办法现场去查API文档的,如果你对优先队列常用的API不熟悉,即使思路再清晰也是写不出来的。

有些面试官喜欢出一些设计题,比如让实现一个字典树,或者实现一个简单的C++的智能指针,这个时候就看语言的掌握情况了,如果连构造函数析构函数的定义都写不出来,那基本就凉凉。

2. 刷题的数量

2.1. 刷题数量不是越多越好

  • 有一道题没刷过,项目经历比较亮眼,直接拿到阿里星offer字节ssp offer的。

  • 当然也遇到过刷了近千道题,最后折在一道快速排序上的。

刷题的数量不是目的,目的是掌握基本知识点。

2.2. 常见知识点

常用的数据结构: 数组、字符串、链表、二叉树、图、前缀树、集合、映射、栈、队列、堆。

常用的解题方法: 递归、迭代、二分法、回溯、贪心、动态规划、位运算、双指针、模拟、拓扑排序、桶排序、单调栈、深度优先搜索、广度优先搜索。

上面提到的数据结构和方法都刷过至少一题之后,就可以做一些开源的项目,做一些科研实验等等了。

3. 刷题的目标

3.1. 代码风格

形成完备的代码风格,代码整洁,变量命名合理,代码流程清晰,常用功能封装为函数。

3.2. 数据结构

  1. 常用的数据结构和常用的解题方法要完全掌握的。

  2. 时空复杂度要会分析。

  3. 常用数据结构的查找、插入、删除的时空复杂度要牢记。

3.3. 排序算法

常见的排序算法实现及其复杂度分析必须要手到擒来。快排,堆排等也是面试的高频

3.4. 测试用例

代码写完了,面试官让你自测一下,这个时候如果不会了,那怪可惜的。

3.5. 调试代码

  • 使用OJ上的编辑器写代码最常用的调试方法就是使用语言自带的打印函数把关键逻辑点的变量打印出来,然后构造一个简单的测试用例,根据打印的结果分析代码逻辑是否正确。

  • 平时利用本地IDE写代码,不理解的函数也可以把关键逻辑打印出来,比如你对递归的流程感到比较疑惑,你可以在递归结束的条件和递归函数的入口加一些打印,通过分析这些打印,递归的整个过程就很清晰了。

3.6. 内存操作

针对C++:

  • 注意对内存的操作,申请的内存用完要记得释放,不要使用未分配内存的指针,C++中定义一个指针,如果不初始化为NULL指针,它是随机指向一块内存的,这个时候如果对它指向的内存操作,会发生未知的错误。

  • 在一些大型项目中可能会导致整个服务的崩溃。良好的内存操作习惯也会让面试官觉得你写代码很严谨

4. 面试的技巧

态度很重要:面试过程中多和面试官交流,题目描述不清可以多追问一下,如果遇到没有思路的问题可以让面试官提示一下,让面试官看到你在积极处理问题。如果一看没思路,直接放弃,基本就凉凉了。

5. 面试的细节

手写算法只是面试的一部分,有时候虽然代码你写出来了,面试官问的其他问题也都答出来了,你以为胜券在握,但是最后挂掉了。这可能是很小的一个细节决定的,比如写代码边界条件考虑不周或者在回答一些问题的时候表达的不自信,回答问题一定不要用“可能如何如何”这样的词语,不懂的问题也不要乱说,可以有根据的推理,但是胡乱说是大忌。多向你懂的领域引导面试官,让他发现你更多的闪光点。平时可以找一些已经工作有经验的学长学姐进行模拟面试,多找下自己的不足。

Last updated