技术面试官主要负责衡量你的技术水平,以及判断你是否符合职位要求。总体而言,对科技公司,技术面试官的意见最为重要。技术面试包括电话面试和现场面试,前者主要偏向概念性的问答,也包括通过协作网站直接写代码等。现场面试通常包括白板写代码,解决一个算法问题或者设计问题等。本书的主要目的就是帮助你通过这轮面试。
一些面试的小技巧如下:一定要先沟通,明确自己了解题意,不要过分考虑或者欠考虑。首先可以给出一个比较容易想到、但并不是最优的解决方案,再逐步优化。在思考的时候也要把思路讲出来,哪怕不是很成熟的方案。一旦遇到困难,可以先自己设法解决,如果五分钟没有思路,可以向面试官求助。适当的提示并不会影响你面试的最终结果。当开始写程序的时候,尽量注意语法格式、变量命名等,避免写伪代码,越接近真实代码越好。写完以后自己检查下有没有明显的错误,可以列举几个简单的测试数据,与面试官一起检验一下整个运行过程。
面试是一个合作解决问题的过程,沟通一定是面试的关键:需要通过沟通展示你的逻辑性、理解能力和表达能力。在面试的最后,通常对方会给你提问的机会,你可以问的问题包括:团队平时使用什么样的技术,通常的工作压力和工作时间,公司最让人兴奋的地方;在当前职位工作了多少年,面试官之前的工作经历与现在相比有什么异同等。
面试考察的基本功,包括以下方面:
- 程序风格:能正确使用缩进,括号要对齐,变量名可以起的有意义;
- 编码习惯:异常检查,边界处理;
- 沟通:让面试官时刻明白你的意图,不要闭着眼睛不停地写。因为你的算法未必对。对了你也未必写得出来。中间稍微有点问题,你就失败了。对于面试官来说,他根本不知道你的解题进行到哪一步了;
- 测试:主动写出合理的测试用例(Test case),一些常见的用例,如null检查。一般你没写的话,面试官会让你写,但如果你主动写出来,说明你有好的习惯,容易加分。
技术面试的流程通常如下,可供参考。
当你拿到一个具体问题时,可以按照以下流程回答:
1.明确题意:通过与面试官交流明确需要解答的问题。这部分主要为了让自己放松心态,并且给面试官留下你具有良好团队意识和交流能力的印象。
2.描述大体思路:描述你打算用什么算法,什么数据结构。主要是为了让面试官了解你的思维过程,如果你给出的解答与他想要的答案偏差太多,可以及时纠正。同时,描述思路也给了你自己思考的机会。
3.实现算法:先处理边界条件。对于重要的算法模块,加一些注释或者与面试官进行交流。目的是让面试官始终了解你在做什么,算法框架是什么。
4.跑一个测试:用一个测试用例走一遍你写的程序。目的在于和面试官一起确保你的算法是有效的,可以在过程中及时发现并纠正自己的错误。同时,给面试官留下你有写单元测试(unit test)习惯的良好印象。
5.描述算法复杂度,回答面试官的问题。
- 内容提要
- 作者简介
- 前言
- 我的故事,你的故事
- 现状
- 目的
- 特色
- 第1章 简历、面试和Offer
- 1.1 简历
- 1.1.1 格式
- 1.1.2 内容安排
- 1.1.3 描述技巧
- 1.2 面试
- 1.2.1 HR
- 1.2.2 技术面试官
- 1.2.3 老板
- 1.3 Offer
- 1.4 常见问题
- 1.5 工具箱
- 第2章 数组和字符串
- 2.1 知识要点
- 2.1.1 数组
- 2.1.2 哈希表
- 2.1.3 String
- 2.2 模式识别
- 2.2.1 使用哈希表
- 2.2.2 利用哈希表实现动态规划的思想
- 2.2.3 String相关问题的处理技巧
- 2.3 工具箱
- 第3章 链表
- 3.1 知识要点
- 3.2 模式识别
- 3.2.1 链表的基本操作
- 3.2.2 哑节点
- 3.2.3 Runner和Chaser
- 3.2.4 遍历并处理节点
- 3.2.5 交换节点的问题
- 3.2.6 同时操作两个链表
- 3.2.7 倒序处理
- 3.3 工具箱
- 第4章 栈和队列
- 4.1 知识要点
- 4.1.1 栈
- 4.1.2 队列
- 4.2 模式识别
- 4.2.1 通过栈实现特殊顺序的读取
- 4.2.2 “Save for later”问题
- 4.2.3 用栈解决自上而下结构的问题
- 4.3 工具箱
- 第5章 树和图
- 5.1 知识要点
- 5.1.1 树
- 5.1.2 字典树
- 5.1.3 堆与优先队列
- 5.1.4 图
- 5.1.5 图的遍历
- 5.1.6 单源最短路径问题
- 5.1.7 任意两点之间的最短距离
- 5.2 模式识别
- 5.2.1 利用分而治之(D&C)策略判断树、图的性质
- 5.2.3 树和其他数据结构的相互转换
- 5.2.4 寻找特定节点
- 5.2.5 图的访问
- 5.3 工具箱
- 第6章 位操作
- 6.1 知识要点
- 6.2 模式识别
- 6.2.1 基本的位操作
- 6.2.2 位掩码
- 6.3 工具箱
- 第7章 面向对象的设计
- 7.1 知识要点
- 7.1.1 设计题解答要领
- 7.1.2 模拟面试
- 7.1.3 抽象、面向对象和解耦(Decoupling)
- 7.1.4 继承/组合/参数化类型
- 7.1.5 设计模式
- 7.2 模式识别
- 7.3 工具箱
- 第8章 递归和动态规划
- 8.1 知识要点
- 8.1.1 构建从子问题到最终目标的方法
- 8.1.2 递归的空间与时间成本
- 8.1.3 自底向上与自顶向下
- 8.1.4 算法策略
- 8.2 模式识别
- 8.2.1 用动态规划(自底向上)解决收敛结构问题
- 8.2.2 最长子序列类型的问题
- 8.2.3 用Memorization(自顶向下)解决收敛结构问题
- 8.2.4 用回溯法(自上而下)解决发散结构问题
- 8.2.5 用D&C策略解决独立子问题
- 第9章 排序和搜索
- 9.1 知识要点
- 9.1.1 常见的内排序算法
- 9.1.2 常见的外排序算法
- 9.1.3 快速选择算法
- 9.1.4 二分查找
- 9.2 模式识别
- 9.2.1 动态数据结构的维护
- 9.2.2 对于有序/部分有序容器的搜索,用二分查找
- 9.2.3 数据范围有限、离散的排序问题
- 9.2.4 Scalability & Memory Limits 问题
- 9.3 工具箱
- 第10章 测试
- 10.1 知识要点
- 10.1.1 测试现实世界的物体、软件或函数
- 10.1.2 故障排除
- 10.2 模式识别
- 10.3 工具箱
- 第11章 网络
- 11.1 知识要点
- 11.1.1 网络分层
- 11.1.2 路由
- 11.1.3 常用网络统计指标
- 11.1.4 TCP vs. UDP
- 11.2 模式识别
- 11.3 工具箱
- 第12章 计算机底层知识
- 12.1 知识要点
- 12.1.1 进程vs.线程
- 12.1.2 上下文切换
- 12.1.3 系统调用
- 12.1.4 Semaphore/Mutex
- 12.1.5 死锁
- 12.1.6 生产者消费者
- 12.1.7 进程间通信
- 12.1.8 逻辑地址/物理地址/虚拟内存
- 12.1.9 文件系统
- 12.1.10 实时vs.分时操作系统
- 12.1.11 编译器
- 版权信息
- 看完了