1、若是要在数组中进行搜索时,率先考虑二分查找,但是二分查找适用于有序的数组,而有时数组中的元素是无序的,就要根据条件查找哪里是有序的。
2、要重点掌握二分查找、归并排序、快速排序
3、若面试题要求在二维数组上搜索路径,可以尝试使用回溯法,回溯法很适合与递归结合,若是有要求说不能使用递归,则可以用栈来模拟递归的过程。
4、若面试题是求某个问题的最优解,并且该问题可以分为多个子问题,那么可以尝试使用动态规划。在采用自上而下的的递归思路去分析动态规划问题的时候,我们会发现子问题之间存在重叠的更小的子问题。为了避免不必要的重复计算,可以采用自下而上的循环代码来实现,也就是把子问题的最优解先算出来并用数组保存下来,接下来基于子问题的解计算大问题的解。
5、位运算:与、或、异或、左移、右移。
6、在做一道反转整数的题目,里边有一种溢出的情况需要考虑
class Solution {
public int reverse(int x) {
// 看了大佬的解法 神了,关键是要预防溢出的情况
int rec = 0;
while(x != 0){
// 这个地方太巧妙了,用来判断是否有溢出
if((rec * 10) / 10 != rec){
rec = 0;
break;
}
rec = rec * 10 + x % 10;
x /= 10;
}
return rec;
}
}
7、当数据量特别特别小时,直接用switch比用map要得多。
8、入门动态规划(第三种方法的思想)
通常我们遍历子串或者子序列有三种遍历方式
- 以某个节点为开头的所有子序列: 如 [a],[a, b],[ a, b, c] ... 再从以 b 为开头的子序列开始遍历 [b] [b, c]。
- 根据子序列的长度为标杆,如先遍历出子序列长度为 1 的子序列,在遍历出长度为 2 的 等等。
- 以子序列的结束节点为基准,先遍历出以某个节点为结束的所有子序列,因为每个节点都可能会是子序列的结束节点,因此要遍历下整个序列,如: 以 b 为结束点的所有子序列: [a , b] [b] 以 c 为结束点的所有子序列: [a, b, c] [b, c] [ c ]。
9、很神奇的题目:最大的子序和