-
注意事项
- 判断输入是否合适,是否超出范围,是否为空,都要考虑齐全,
求链表倒数第 k 个数,k小于0,链表长度小于 k 是否考虑周全
求丑数第 k 个,k<0 是否考虑周全 - 由于计算机表示小数 (包括 float 和 double 型小数) 都有误差,我们不能直接用等号 ( == ) 判断两个小数是否相等。如果两个小数的差的绝对值很小,如小于 0.0000001,就可以认为它们相等
- 判断输入是否合适,是否超出范围,是否为空,都要考虑齐全,
-
面试官在检查与字符串相关的代码时经常会发现两种问题
- 1、输入空指针 nullptr 时程序会崩溃
- 2、内存访问越界的问题,也就是试图访问不属于字符串的内存
高质量的代码
1,代码规范性: 书写清晰,布局清晰,命名合理
应聘者在写代码的时候,最好用完整的英文单词组合命名变量和函数,以便面试官能一眼读懂代码的意图
2,代码完整性
在面试过程中,面试官会非常关注应聘者考虑问题是否周全。面试官通过检查代码是否完整来考查应聘者的思维是否全面。通常面试官会检查应聘者的代码是否完成了基本功能,输入边界值是否能得到正确的输出,是否对各种不规范的非法输入做出了合理的错误处理
查找与排序
查找相对而言较为简单。有 顺序查找,二分查找,哈希表查找,二叉排序树查找
排序比查找复杂一些。面试官会经常要求应聘者比较插入排序,冒泡排序,归并排序,快速排序等不同算法的优劣。强烈建议应聘者在准备面试的时候,一定要对各种排序算法的特点烂熟于胸,能够从额外空间消耗,平均时间复杂度和最差时间复杂度等方面去比较它们的优缺点
数字
二分查找
- 面试题53(1): 数字在排序数组中出现的次数
- 面试题53(2): 0 ~ n-1 中缺失的数字
- 面试题53(3): 数组中数值和下标相等的元素
- 面试题57(1): 和为 s 的两个数字
- 面试题57(2): 和为 s 的连续正数序列
数组
思路:哈希表 map
- 面试题3(1): 数组中重复的数字
- 面试题3(2): 不修改数组找出重复的数字
- 面试题4: 二维数组中的查找
- 面试题11: 旋转数组的最小数字
- 面试题21: 调整数组顺序使奇数位于偶数前面
- 面试题29: 顺时针打印矩阵
- 面试题39: 数组中出现次数超过一半的数字
- 面试题42: 连续子数组的最大和
- 面试题51: 数组中的逆序对
字符串
- 面试题5: 替换空格
- 面试题20: 表示数值的字符串
- 面试题38: 字符串的排列
- 面试题50(1): 字符串中第一个只出现一次的字符
- 面试题58(1): 翻转单词顺序
- 面试题67: 把字符串转化成整数
链表
- 面试题6: 从尾到头打印链表
- 面试题18(1): 在O(1)时间内删除链表中的节点
- 面试题18(2): 删除链表中重复的节点
- 面试题23: 链表中环的入口节点
- 面试题24: 反转链表
- 面试题25: 合并两个排序的链表
- 面试题52: 两个链表的第一个公共节点
递归 / 循环
回溯法
动态规划
位运算
把一个整数减去 1 之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的 1 变成 0。(很多二进制问题都可以用这种思路解决)
位运算包括5种运算:与(&),或(|),异或(^),左移(<<),右移(>>)
把整数右移一位和把整数除以2在数学上是等价的,但是效率上,除法运算效率比移位运算低得多,在实际编程中应尽可能地用移位运算符代替乘除法
二叉树
与二叉树相关的代码有大量的指针操作,在每次使用指针的时候,我们都要问自己这个指针有没有可能是 NULL,如果是 NULL 则该怎么处理
- 面试题7: 重建二叉树
- 面试题8: 二叉树的下一个节点
- 面试题26: 树的子结构
- 面试题27: 二叉树的镜像
- 面试题28: 对称二叉树
- 面试题32(1): 不分行从上到下打印二叉树
- 面试题32(2): 分行从上到下打印二叉树
- 面试题32(3): 之字形打印二叉树
- 面试题33: 二叉搜索树的后序遍历序列
- 面试题34: 二叉树中和为某一值的路径
- 面试题37: 序列化二叉树
- 面试题54: 二叉搜索树的第 K 大节点
- 面试题55(1): 二叉树的深度
- 面试题55(2): 平衡二叉树
- 面试题68: 树中两个节点的最低公共祖先