剑指Offer总述

面试 厚积薄发 戒骄戒躁

第二章

第三章 高质量的代码

1.代码的规范性

书写、布局、命名(最好用完整的英文单词组合命名变量和函数)

2.代码的完整性

一、从3个方面确保代码的完整性
1.普通功能:
(1)如提到最大的数字,有多大? 用int, long long…表示是否会溢出? 如果任意大,则需用特殊数据结构,如字符串或数组表示以防溢出。
2.边界值
使用循环时循环的边界条件,使用递归时终止的边界值
3.负面测试(各种错误输入)
各种错误输入或非法输入时,是否能够做出合适的错误处理。
二、错误处理方法
1.返回值
2.全局变量
3.异常
实际采用哪种要看面试官需求,根据题目分析有哪些非法输入并和面试官讨论如何处理。
在这里插入图片描述

3.代码的鲁棒性

防御性编程:
提高鲁棒性的有效途径是进行防御型编程。
防御性编程是一种编程习惯,预想问题并提出相应解决方法

本章总结

在这里插入图片描述

第四章 解决面试题的思路

4.3 举例让抽象问题具体化

意义:通过画图、举例等方式不仅有助于自己解题,将抽象问题形象具体化,快速找到隐藏的规律,而且会使面试官清楚的理解我们的思路,同时证明自己有很好的沟通能力,用简单的方式阐述清楚复杂的问题。

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

5.2时间效率

通常情况下对于普通的应用,是空间换时间,时间复杂度更重要(对算法要求更高,体现编程、数据结构与算法的功底)。
某些存储空间少的情况下(如嵌入式设备)则不一定。

递归

本质:是把一个大的复杂问题分解成两个或者多个小的简单问题。如小问题有重叠部分,则时间效率很差。
通常基于递归的实现代码会比较简洁,但性能不如基于循环的实现方法

在这里插入图片描述
展示敏捷的思维能力和追求完美的激情,第一时间想到的可能非最优,但说出来证明思维敏捷,然后再补充优化,即使题目难也要保有激情和耐心,不退缩

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

多和面试官讨论时间与空间的取舍是很有必要的,既展示沟通能力,又体现了对软件性能全方位的把握能力。

本章总结

一、降低时间复杂度方法:
1.改用更高效算法
2.空间换时间(如用数组实现简单的哈希表)
二、空间换时间不一定都可取,具体情况具体分析。

第六章 面试中的各项能力

6.2 沟通能力和学习能力

1.沟通能力
良好的沟通能力,逻辑清晰,语言详略得当,不要不懂装懂,用于承认不清楚的知识点
2.学习能力
(1)询问近期做的项目、阅读的书籍,有哪些收获
(2)抛出新概念,看能否短时间理解并解决相关问题
3.善于学习、沟通的人也善于提问
表现得态度积极,求职欲望强烈会加分。
通常学习能力强的人具有主动积极的态度,在已有的理解上思考后向面试官提问题。
可能面试官故意不将题目描述清楚,期待你一步步提问以弄清。

6.3 知识迁移能力(举一反三)

将经典的问题稍作变换。
每做一题后总结其解法特点,并加以应用到同类型的其他题目中去。

6.4 抽象建模能力

除了有扎实的数学基础和编程能力,还要有敏锐的洞察力和丰富的想象力
建模步骤:
(1)选择合理的数据结构表述问题
(2)分析模型中的内在规律,并用编程语言表述这种规律(并不是所有问题的内在规律都显而易见)

6.5 发散思维能力

面试官有意限制不能使用常规思路,考察应聘者心态,多角度思考问题。如四则运算被限制可考虑二进制和位运算(Ques65)