计算机复试和公司入职考试很多会考算法,如果把计算机复试的基本掌握,算法题就总体很简单了。
算法分类:
1.暴力求解。
利用循环
2.贪心算法。
1)利用很明显的极限
2)不太明显的,但是局部不影响其他,递进推出最优解。比如旅行加油问题
3.数据结构
1)队列,做BFS. 因为BFS在距离都同的情况下,有最近的属性,所以可以做最短步骤搜索。比如解锁问题。java中的队列,和C++中的队列。
C++中的队列,queue.priority_queue。 优先队列可以重载数据结构运算符,来达到根据需要进行排序的功能。比如最短路以距离为排序规则,每次头部都是最短距离。
2)栈,DFS。主要是类似暴力求解。有时候能得到最优解的时候,记得直接退出所有递归。 否则有些算法走不动。
3)map。Java里有hashmap和treemap. C++里的map。给予红黑树的底层有序,会默认按照字母表顺序排列,有些问题可能会用到。
4)set。长用来去重。java里应该有个函数直接看包含否。C++里可以直接用count看是否已经包含了。
5)其他结构体,根据需要进行定义。C++里结构体可以有构造函数。Java全都是类,按照类就行了。
4. 模式匹配。
字符串模式匹配记得利用next数组进行变换就行了。
5. 排序和查找
java里面冲在compare那个类似这样的函数可以根据需要排序。C++里也可以冲在运算符或者写一个bool函数来进行排序。
查找有二分查找。
6. 数学问题,比如多次幂,最大公约数,最小公倍数,进制转换等。知道公式事半功倍。
7.递归。递归逻辑一般比较明显,注意题目的时间要求,如果时间很短,说明不适合递归。可以改成动态规划直接来做。
8.搜索
DFS和BFS
9.图论
邻接矩阵,邻接表存边集。 还有并查集。利用Father[]数组存储共同的头结点,相同说明统一集合。Height[]数组存储书高度,方便进行合并。find查找father数组并且进行压缩。
并查集可以用来做很多事,比如:判断集合是否同一个。很多城市联通还需要几条路,prim算法,最短路也可以实现。
Dijkstra算法。经典。
10.动态规划
递归变化,最大连续子序列和。最长递增子序列,最长公共子序列。核心思想类似于数学上的归纳法。设好矩阵ij代表的两种信息,然后以0,1等明显的开始,推出递推公式然后进行演算。
背包问题,0-1背包,取或不取。 完全背包:可以随便取。多重背包:利用2进制分解法,使得其分解成各种0-1背包问题,所有的物品加起来能形成任何数目。比如7分解为4,2,1所有1-7都可以表示。转化为0-1背包。
以目前学校的难度看,985有名计算机学校出的算法题最高难度可拿分的基本也就是动态规划,模式匹配,背包问题这种级别。 网路面试来说。