数据结构和算法在程序员面试中的重要性不言而喻,也是一大难点。不过回答这类问题是有一些技巧的。
1.归纳法
按照题意先列出前几项或者举一些特定的例子,从而分析总结其中的一般规律。(找规律)
2.相似法
平时多刷点leetcode,剑指offer,可以按照标签刷题,发现某种类型的题目的特征和相似性。
3.简化法
遇到复杂的算法题,可以先把它简化,例如改变一下数据类型或空间大小,先尝试解决简化后的问题,再根据这个思路套用到复杂的问题中。
4.递归法
很多问题可以逐层分解,最后归纳为一些最简单的问题。首先解决最基本的情况,然后以此为基础解决接下来的问题。(如求全排列问题)
5.分治法
问题的规模越小,越容易直接求解。
分治法就是将一个难以解决的大问题分割成一些规模较小的相关问题。
分治法一般包括三个步骤:
(1)分割问题(分割的小问题最好有相等规模)
(2)对这些小问题求解(常用递归)
(3)合并这些小问题,得到原始问题的解
6.Hash法
很多面试题要求算法尽可能高效(即时间复杂度小)。
要想时间复杂度低,比较简单的方法是牺牲空间,用空间换取时间。
而用空间换时间的最有效的方法是Hash法。
对于涉及大规模数据处理的算法设计题,Hash法是较好的方法。
(若对空间也有要求就别用这个了…另想办法)
7.轮询法
实在不知道用什么方法解决,就一个个排除所有可能,常考的数据结构和算法就那么多,总能找到适合解题的方法。
最常考的数据结构和算法:
(1)数据结构:链表、数组、二叉树、树、堆(大顶堆,小顶堆)、栈、队列、向量、Hash表
(2)算法:DFS和BFS、递归、二分查找、排序(归并、快排等)、树的插入/删除/查找/遍历、图论、Hash法、分治法、动态规划
(3)概念:位操作、设计模式、内存管理(堆、栈)