封面

版权信息

前言

NOTE

其中第1.3.2节深入讨论了技术面试中的5个要素,是全书的大纲,接下来的第2~6章逐一讨论每个要点。

2022-05-27 14:50:56

推荐序二

推荐序一

第1章 面试的流程

1.2 面试的三种形式

1.2.1 电话面试

1.2.2 共享桌面远程面试

NOTE

毫不犹豫地抛出绿色的橄榄枝

2022-10-15 15:09:08

NOTE

在共享桌面远程面试过程中,面试官最关心的是应聘者的编程习惯及调试能力。

2022-10-15 15:09:41

1.2.3 现场面试

1.3 面试的三个环节

NOTE

首先是行为面试,面试官参照简历了解应聘者的过往经验;然后是技术面试,这一环节很有可能会要求应聘者现场写代码;最后一个环节是应聘者问几个自己最感兴趣的问题。

2022-05-27 23:29:31

1.3.1 行为面试环节

NOTE

建议用如图1.3所示的STAR模型描述自己经历过的每一个项目。[插图]图1.3 简历中描述项目的STAR模型

2022-05-27 23:30:00

NOTE

简历中我们描述技能的掌握程度大部分应该是“熟悉”。如果我们在实际项目中使用某一项技术已经有较长的时间,通过查阅相关的文档可以独立解决大部分问题,我们就熟悉它了。

2022-05-27 23:30:47

NOTE

如果我们对一项技术使用得得心应手,在项目开发过程中当同学或同事向我们请教这个领域的问题我们都有信心也有能力解决,这个时候我们就可以说自己精通了这项技术。

2022-05-27 23:31:04

1.3.2 技术面试环节

NOTE

扎实的基础知识、能写高质量的代码、分析问题时思路清晰、能优化时间效率和空间效率,以及学习沟通等各方面的能力

2022-05-27 23:50:40

NOTE

面试的时候如果遇到简单的问题,应聘者一定要注重细节,写出完整、鲁棒的代码。如果遇到复杂的问题,应聘者可以通过画图、举具体例子分析和分解复杂问题等方法先理清思路再动手编程。

2022-05-27 23:51:15

NOTE

编程语言、数据结构和算法

2022-10-15 15:12:12

NOTE

把 const 加在指针不同的位置是否有区别

2022-10-15 15:13:40

NOTE

应聘者需要熟练掌握链表、树、栈、队列和哈希表等数据结构,以及它们的操作

2022-10-15 15:14:44

NOTE

大部分公司都会注重考查查找、排序等算法。应聘者可以在了解各种查找和排序算法的基础上,重点掌握二分查找、归并排序和快速排序,因为很多面试题都只是这些算法的变体而已

2022-10-15 15:15:21

NOTE

少数对算法很重视的公司比如谷歌或者百度,还会要求应聘者熟练掌握动态规划和贪婪算法

2022-10-15 15:15:43

NOTE

在面试过程中,面试官总会格外关注边界条件、特殊输入等看似细枝末节但实质至关重要的地方,以考查应聘者是否注重代码质量

2022-10-15 15:16:06

NOTE

如果题目很简单,面试官就会期待应聘者能够很完整地解决问题,除了完成基本功能之外,还要考虑到边界条件、错误处理等各个方面。

2022-05-27 23:51:44

NOTE

除了问题考虑不全面之外,还有一个面试官不能容忍的错误就是程序不够鲁棒。以前面的那段代码为例,只要输入一个空指针,程序立即崩溃。这样的代码如果加入到软件当中,将是灾难。因此当面试官看到代码中对空指针没有判断并加以特殊处理的时候,通常他连往下看的兴趣都没有。

2022-05-27 23:51:56

NOTE

面试官的第一种方法是询问应聘者最近在看什么书、从中学到了哪些新技术。

2022-10-15 15:25:23

1.3.3 应聘者提问环节

1.4 本章小结

NOTE

要谈工资要等通过面试之后和HR谈

2022-05-27 23:52:43

NOTE

最后推荐问的问题是与招聘的职位或者项目相关的问题。

2022-05-27 23:53:03

第2章 面试需要的基础知识

2.2 编程语言

2.2.1 C++

NOTE

● 《Effective C++》。这本书很适合在面试之前突击C++。这本书列举了使用C++经常出现的问题及解决这些问题的技巧。该书中提到的问题也是面试官很喜欢问的问题。● 《C++Primer》。读完这本书,就会对C++的语法有全面的了解。● 《Inside C++Object Model》。这本书有助于我们深入了解C++对象的内部。读懂这本书后很多C++难题,比如前面的sizeof的问题、虚函数的调用机制等,都会变得很容易。● 《The C++ Programming Language》。如果是想全面深入掌握C++,没有哪本书比这本书更适合的了。

2022-09-14 12:52:16

面试题1:赋值运算符函数

NOTE

是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值

2022-07-04 18:00:07

NOTE

是否把传入的参数的类型声明为常量引用。如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数。把参数声明为引用可以避免这样的无谓消耗,能提高代码的效率

2022-09-14 09:13:31

NOTE

一旦在赋值运算符函数内部抛出一个异常,CMyString的实例不再保持有效的状态,这就违背了异常安全性(Exception Safety)原则。

2022-09-14 12:48:55

NOTE

要想在赋值运算符函数中实现异常安全性,我们有两种方法。一个简单的办法是我们先用new分配新内容再用delete释放已有的内容。这样只在分配内容成功之后再释放原来的内容,也就是当分配内存失败时我们能确保 CMyString 的实例不会被修改。我们还有一个更好的办法是先创建一个临时实例,再交换临时实例和原来的实例

2022-09-14 12:49:25

2.2.2 C#

面试题2:实现Singleton模式

NOTE

把构造函数设为私有函数以禁止他人创建实例

2022-09-15 00:40:12

NOTE

两个线程都会创建一个实例,此时类型Singleton1就不再满足单例模式的要求了

2022-09-15 00:40:50

NOTE

加锁是一个非常耗时的操作,在没有必要的时候我们应该尽量避免

2022-09-15 00:41:45

NOTE

静态构造函数

2022-09-15 00:43:42

NOTE

初始化静态变量instance的时候创建一个实例。由于C#是在调用静态构造函数时初始化静态变量,.NET运行时能够确保只调用一次静态构造函数,这样我们就能够保证只初始化一次instance

2022-09-15 00:44:06

NOTE

按需创建实例

2022-09-15 00:44:59

NOTE

。第四种方法利用C#的静态构造函数的特性,确保只创建一个实例。第五种方法利用私有嵌套类型的特性,做到只在真正需要的时候才会创建实例,提高空间使用效率。

2022-09-15 00:46:14

2.3 数据结构

2.3.1 数组

NOTE

用数组来实现简单的哈希表:把数组的下标设为哈希表的键值(Key),而把数组中的每一个数字设为哈希表的值(Value),这样每一个下标及数组中该下标对应的数字就组成了一个键值-值的配对

2022-09-15 00:51:52

NOTE

在 C/C++中,数组和指针是相互关联又有区别的两个概念。当我们声明一个数组时,其数组的名字也是一个指针,该指针指向数组的第一个元素。我们可以用一个指针来访问数组。但值得注意的是,C/C++没有记录数组的大小,因此用指针访问数组中的元素时,程序员要确保没有超出数组的边界

2022-09-15 00:54:48

NOTE

在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针

2022-09-15 00:55:15

面试题3:二维数组中的查找

2.3.2 字符串

NOTE

为了节省内存,C/C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。但用常量内存初始化数组,情况却有所不同

2022-09-16 00:42:36

面试题4:替换空格

NOTE

在网络编程中,如果URL参数中含有特殊字符,如空格、’#‘等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成”%20”。再比如’#‘的ASCII码为35,即十六进制的0x23,它在URL中被替换为”%23”。

2022-09-16 00:43:43

2.3.3 链表

NOTE

链表的创建、插入结点、删除结点等操作都只需要20行左右的代码就能实现,其代码量比较适合面试。而像哈希表、有向图等复杂数据结构,实现它们的一个操作需要的代码量都较大,很难在几十分钟的面试中完成。另外,由于链表是一种动态的数据结构,其操作需要对指针进行操作,因此应聘者需要有较好的编程功底才能写出完整的操作链表的代码。而且链表这种数据结构很灵活,面试官可以用链表来设计具有挑战性的面试题

2022-09-20 00:38:23

NOTE

在创建链表时,无须知道链表的长度。当插入一个结点时,我们只需要为新结点分配内存,然后调整指针的指向来确保新结点被链接到链表当

2022-09-20 00:38:45

面试题5:从尾到头打印链表

2.3.4 树

面试题6:重建二叉树

NOTE

前序遍历序列的第一个数字是根结点的值

2022-10-03 01:18:54

2.3.5 栈和队列

面试题7:用两个栈实现队列

2.4 算法和数据操作

2.4.1 查找和排序

面试题8:旋转数组的最小数字

2.4.2 递归和循环

面试题9:斐波那契数列

2.4.3 位运算

面试题10:二进制中1的个数

2.5 本章小结

第3章 高质量的代码

NOTE

不能容忍代码只是针对一种假想的‘正常值’进行处理,不考虑异常状况,也不考虑资源的回收等问题。”

2022-05-27 23:54:28

3.2 代码的规范性

NOTE

通常编程面试的代码量都不会超过50行,书写不用花多少时间,关键是在写代码之前形成清晰的思路并能把思路用编程语言清楚地书写出来。

2022-05-27 23:54:01

3.3 代码的完整性

面试题11:数值的整数次方

面试题12:打印1到最大的n位数

面试题13:在O(1)时间删除链表结点

面试题14:调整数组顺序使奇数位于偶数前面

3.4 代码的鲁棒性

面试题15:链表中倒数第k个结点

面试题16:反转链表

面试题17:合并两个排序的链表

面试题18:树的子结构

3.5本章小结

第4章 解决面试题的思路

4.2 画图让抽象问题形象化

面试题19:二叉树的镜像

面试题20:顺时针打印矩阵

4.3举例让抽象问题具体化

面试题21:包含min函数的栈

面试题22:栈的压入、弹出序列

面试题23:从上往下打印二叉树

面试题24:二叉搜索树的后序遍历序列

4.4 分解让复杂问题简单化

面试题26:复杂链表的复制

面试题27:二叉搜索树与双向链表

面试题28:字符串的排列

4.5 本章小结

第5章 优化时间和空间效率

5.2 时间效率

面试题29:数组中出现次数超过一半的数字

面试题30:最小的k个数

面试题31:连续子数组的最大和

面试题32:从1到n整数中1出现的次数

面试题33:把数组排成最小的数

5.3 时间效率与空间效率的平衡

面试题34:丑数

面试题35:第一个只出现一次的字符

面试题36:数组中的逆序对

面试题37:两个链表的第一个公共结点

5.4 本章小结

第6章 面试中的各项能力

6.2 沟通能力和学习能力

6.3 知识迁移能力

面试题38:数字在排序数组中出现的次数

面试题39:二叉树的深度

面试题41:和为s的两个数字VS和为s的连续正数序列

面试题42:翻转单词顺序 VS左旋转字符串

6.4 抽象建模能力

面试题43:n个骰子的点数

面试题45:圆圈中最后剩下的数字

6.5 发散思维能力

面试题46:求1+2+…+n

面试题47:不用加减乘除做加法

面试题48:不能被继承的类

6.6 本章小结

第7章 两个面试案例

7.1 案例一:(面试题49)把字符串转换成整数

7.2 案例二:(面试题50)树中两个结点的最低公共祖先