文章目录
1. 如何写出正确的程序?
- 明确变量的含义
- 循环不变量
- 小数据量测试
- 大数据量测试
- 重点:是否能够耐心、快速、准确地找到程序中的Bug并对此修改,是技术人员的核心竞争力。
2. 数组中的常见问题
- 排序:选择排序、插入排序、归并排序、快速排序
- 查找:二分查找法
- 数据结构:栈、队列、堆
3. 数组优点
- 构建非常简单
- 能在 O(1) 的时间里根据数组的下标(index)查询某个元素
4. 数组缺点
- 构建时必须分配一段连续的空间
- 查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)
- 删除和添加某个元素时,同样需要耗费 O(n) 的时间
5. 注意事项
- 当你在考虑是否应当采用数组去辅助你的算法时,请务必考虑它的优缺点,看看它的缺点是否会阻碍你的算法复杂度以及空间复杂度。
- 改变变量定义,依然可以写出正确的算法,此时要细致地检查边界值和比较运算符
6. 对于去重等需要有删除操作的题目,需要和面试官明确
- 如何定义删除?从数组中去除?还是放在数组末尾?
- 剩余元素的排列是否要保证原有的相对顺序?
- 是否有空间复杂度的要求? 如O(1)
7. 判断是否为回文字符串,需要和面试官明确
- 空字符串如何看?
- 字符的定义?
- 大小写问题
8. 关于字符集的问题,需要和面试官明确
- 字符集范围?只有字母?数字+字母?还是ASCII?
- 大小写是否敏感?
- 没有解返回什么?
- 若有多个解怎么办?返回多个的顺序?
- “包含”是什么意思,需要限定数量吗?
9. 经典例题之字符串排序、去重
- LeetCode 第 283 题:移动零
- LeetCode 第 27 题:移除元素
- LeetCode 第 26 题: 删除排序数组中的重复项
- LeetCode 第 80 题:删除排序数组中的重复项 II
10. 经典例题之三路快排partition思路的应用
- LeetCode 第 75 题 : 颜色分类
- LeetCode 第 88 题 :合并两个有序数组
- LeetCode 第 215 题:数组中的第K个最大元素
11. 经典例题之双索引-对撞指针
- LeetCode 第 167 题 :两数之和 II - 输入有序数组
- LeetCode 第 125 题 :验证回文串
- LeetCode 第 344 题 :反转字符串
- LeetCode 第 345 题 : 反转字符串中的元音字母
- LeetCode 第 11 题 :盛最多水的容器
12. 经典例题之双索引-滑动窗口
- LeetCode 第 209 题:长度最小的子数组
- LeetCode 第 3 题:无重复字符的最长子串
- LeetCode 第 438 题:找到字符串中所有字母异位词
- LeetCode 第 76 题:最小覆盖子串