**
依同学推荐,准备开始刷《剑指offer》66题。五一假期最后一天,花了一下午时间,将本书囫囵吞枣的浏览了一遍,旨在了解作者的行文思路和框架,以及主张的核心编程技巧。以下为全书概要。
**
——题记
2019年5月4日 于国家图书馆
1.数据结构
- 数组
占据连续内存并按顺序存储,需先指定容量,后根据大小分配内存。 - 字符串
若干字符组成的序列。 - 链表
由指针将若干节点连接成链状结构。动态数据结构,在创建链表时,无须知道长度。插入一个节点时,为新节点分配内存,然后调整指针的指向来确保新的节点被链接到链表中。 - 栈和队列
栈:后进先出。 队列:先进先出。 - 二叉树
在每个节点最多只能有两个子节点。
前序遍历:根节点>左子节点>右子节点。
中序遍历:左子节点>根节点>右子节点。
后序遍历:左子节点>右子节点>根节点。
二叉搜索树:左子节点总是小于或等于根节点,右子节点总是大于或等于根节点。
最大堆:根节点的值最大。
最小堆:根节点的值最小。
红黑树:节点定义为红黑两种颜色,并通过规则确保从根节点到叶节点的最大路径的长度不超过最短路径的两倍。
2.算法和数据操作
- 递归和循环
递归:在一个函数的内部调用这个函数自身。
循环:通过设置计算的初始值及终止条件,在一个范围内重复运算。 - 查找和排序
顺序、二分、哈希表、二叉排序树查找。
插入、冒泡、归并、快速排序。 - 回溯法
从解决问题每一步的所有可能选项里系统的选择出一个可行的解决方案。适用于多步骤问题。 - 动态规划和贪婪算法
动态规划:
1.求一个问题的最优解。
2.整体问题的最优解依赖各子问题的最优解。
3.大问题分解为若干小问题,小问题之间还有相互重叠的更小的子问题。
4.从上往下分析问题,从下往上求解问题。
贪婪算法:每一步都可以做出一个贪婪选择,基于这个选择,确定能得到最优解。 - 位运算
把数字用二进制表示之后,对每一位上0或1的运算。
3.代码完整性
代码完整性保证了程序的可扩展和可维护性。
- 功能测试
在基本功能基础上,挖掘更多功能需求。 - 边界测试
循环边界条件;递归终止边界值;最大、小输入。 - 负面测试
错误输入>合理的错误处理。 - 错误处理方法
返回值;全局变量;异常。
4.代码鲁棒性
程序可判断输入是否合乎规范要求,并对不符合要求的输入予以合理的处理。
- 防御性编程
预见在何处可能会出现问题,并为这些可能出现的问题制定处理方式。
函数入口验证用户输入是否符合要求。
5.解决复杂问题的思路
画图;举例;分解。
6.优化时间和空间效率
- 时间效率
- 时间效率和空间效率的平衡
以牺牲一定的空间为代价来优化时间性能,以尽可能缩短软件的响应时间,但嵌入式开发等具体问题还需具体分析。
7.面试中的各项能力
- 沟通能力和学习能力
- 知识迁移能力
- 抽象建模能力
- 发散思维能力
Reference
1.《剑指offer》第二版,何海涛。