《剑指offer》读书笔记——第二章:面试需要的基础知识
一、面试官谈基础知识
无干货
二、编程语言
主要谈了C++和C#两个编程语言,与python相关度不高,在此按下不表。
三、数据结构
1.数组
- 最简单的数据结构,它占据一块连续的内存并按照顺序存储数据。
- 用数组可以实现简单的哈希表。
- C/C++中数组的名字是一个指向数组第一个元素的指针,但在使用指针访问数组元素过程中需要确保指针没有超出数组的边界。
- 面试题:二维数组中的查找
2.字符串
- 字符串是由若干字符组成的序列。
- C/C++中的字符串都以“\0”作为结尾。
- 面试题:替换空格
从头到尾地复制(O( n 2 n^{2} n2))比从尾到头地复制(O(n))有更高的时间复杂度。
3.链表
- 链表是一种动态的数据结构,因为在创建链表时无需事先知道链表的长度。
- 当插入新的节点时,只需要为新的节点分配内存,然后调整指针的指向来确保新节点被链接到链表中。
- 链表的变体:①环形链表(将链表的末尾节点指向头节点);②双向链表(链表中的节点除了有指向下一个节点的指针,还有指向前一个结点的指针);③复杂链表(链表中的节点除了有指向下一个节点的指针,还有指向任意一个结点的指针)。
- 面试题:从尾到头打印链表
这里需要注意问清楚面试官的需求,是否允许在打印的同时修改链表的结构。
4.树
- 逻辑:除了根节点之外都有一个父节点,除了叶节点之外都有一个或多个子节点。
- 父节点和子节点之间用指针链接。
- 二叉树的几种遍历方式:①先序遍历;②中序遍历;③后序遍历。
- 二叉树的上述三种遍历都有递归和循环两种实现方法,这六种方法需要了如指掌。
- 二叉树的特例:①二叉搜索树(左子节点总是小于等于根节点,右子节点总是大于等于根节点);②堆(最大堆(根节点的值最大),最小堆(根节点的值最小));③红黑树。
- 面试题:重建二叉树
5.栈和队列
- 栈:先进后出,最后被压入(push)栈的元素会被第一个弹出(pop);
- 队列:先进先出,第一个进入队列的元素将会第一个出来;
- 面试题1:用两个栈实现队列
- 面试题2:用两个队列实现栈
四、算法和数据操作
1.查找和排序
- 查找的分类:顺序查找、二分查找、哈希表查找、二叉排序树查找;
- 二分查找:排序数组或者是部分排序的数组;
- 排序的分类:插入排序、冒泡排序、归并排序、快速排序;
- 对于排序的各种方法,需要熟悉各方法的空间复杂度、时间复杂度;
- 面试过程中面对排序题,需要向面试官问清楚排序的数字范围,辅助空间大小;
- 面试题:旋转数组的最小数字
2.递归和循环
- 递归是在一个函数的内部调用这个函数自身;
- 循环是通过设置计算的初始值及终止条件,在一个范围内重复运算;
- 递归虽然简洁,但函数调用有时间和空间的消耗,甚至会造成调用栈溢出;
- 面试题:斐波那契数列
递归;循环(动态规划);矩阵快速幂
3.位运算
- 位运算是将数字表示为二进制之后,对每一位上0或者1的运算。
- 位运算一共只有五种运算:与、或、异或、左移(右边补0即可)、右移(区分有符号数值与无符号数值,有符号数值左边补符号位,无符号数之左边补0)。
- 面试题:二进制中1的个数
①将输入的二进制数不断右移一位然后与1做与运算,当输入负数时容易引起死循环;②将1不断左移一位然后与输入的二进制数做与运算,循环的次数等于整数二进制的位数;③将整数减去1然后再和原整数做与运算,就能够将整数最右边一位变成0。
总结
面试者需要从编程语言、数据结构、算法3各方面来做好面试准备。
数据结构中,数组和字符串是两种最基本的数据结构,链表是面试中使用频率最高的数据结构,树难度更高一点。栈与递归密切相关,队列在图的宽度优先遍历中需要用到。
查找和排序是面试中最经常考察的算法,时间复杂度、空间复杂度分析方法也需要熟练掌握。