引言
以前在学校的时候,为了面试,看了一些面试的算法,现在回过头去,一方面发现满满地都是记忆,另一方面觉得博客里面不应该有很多的文章只是仅仅讨论一个小问题的算法,好吧,就把它们放在这个汇总的文章吧。里面的这些算法一些是C++的,一些是Python,但随着毕业以后,由于做安卓开发的缘故,主语言变成了Java,好吧,那就以后有时间慢慢的一个个翻译成Java的吧,但是暂时先机械的移动它们到一起。
让我们开始吧
一个问题就是一小节,就这么定了。
建堆排序
建堆排序,原理是将数据映射成严格二叉树,先建立一个大顶堆,然后头部是最优解,将最优的解换到最后,将一个普通元素换到头顶,然后隔离最后一个元素,将新来的顶部参与重新建堆,不断的重复此操作,最后得到排序完的数组。
以上的代码中,除了可以排序外,我还插入一了一段使用建堆找出N个数中最优的几个解的算法,即getMaxKNumbers(int k),原理都是堆算法。
找出2N+1个两两配对数中落单那个
如题,找出2N+1个两两配对数中落单那个,对于这个问题,最暴力的求解方法是采用遍历的操作,然后全部进行,以下方法使用了一个辅助类,其原理是一个智能容器,当插入元素的时候判断集合中是否已经有了该元素,没有就添加,有的话就删除,如下
当时我就拿着这个算法给面试官看,面试官不是很满意,后来回来查询了一下,有个比较简单的办法,那就是采用异或操作
递归求解二叉树的深度
如题,递归求解二叉树的深度,又是一个入门级的问题,可是常常会忘掉哦。
首先定义节点
假设根节点为
Node root;
求解树的深度为
求解为
移动星号
要求字符串为号和26个字母的任意组合把号都移动到最右侧,把字母移到最右侧并保持相对顺序不变。
求一串彩色珠子中包含所有颜色最短的一串长度
以[1,2,2,1,1,3,0,0,2,2,3,2,3]为例子
最简单的是暴力破解法,两个循环,这肯定被鄙视的,在参考了网上的一些想法后,自己写了个Java版本的,主要思想为
第一步:使用两个指针,一开始都指向头节点。
第二步:指针一往后移动,在范围内,当包含了所有颜色的时候,停下来。
第三步:指针二往后移动,在范围内,移动的过程中判断是否包含所有颜色,当不包含的时候停下来。
第四步:计算两指针间距离,如果小于上一最小记录便将最小记录更改为该距离。
第五步:重复以上动作直到指针一越界停止。
这里使用一个判断函数,用来计算是否包含了所有元素,思路为开辟一个颜色大小的数组,将颜色分别对应一个数字,这可以通过枚举实现:
开始所有数组元素置为0,指针一移动时,将指针一指向的元素下标对应的元素加一,指针二移动的时候减一。如下:
求一个字符串的最大连续递增数子串
题目的意思呢,其实也是很好理解的,就是将递增的子字符串求出来,那么开始操刀工作吧。
查找单链表的倒数第k个节点
这道题考察了边界条件,首先得判断链表的长度得小于或者等于k,然后按照先将一个指针移动到k-1的位置,再用一指针指向头部和它一起移动,直到第一个指针到底,这样时间复杂度为O(N),代码如下
建树、前序、中序、后序遍历Java版
如题,建树、前序、中序、后序遍历是常见的算法问题,据说大牛到Google面试被要求反转二叉树没成功,当即被说you suck了,那么赶紧看看这个不至于以后被骂了。
将一个字符串不使用额外容器向左移动M位
如题,好了不说了,直接上代码吧,主要的要求就是在原位操作,不能开辟新的空间
关于Fibonacci数的效率的考虑
很容易就可以得到递推公式的斐波那契数列的递归解法,但是又没有考虑过,递归虽然酷,但是效率呢?
这样的函数会调用巨多次,你会发现算到100根本就算不动了!于是是不是应该记下之前算过的解呢,那么每个N对应的Fib数是一定的,我们可以采用键值对的方式储存,那么这样子,就不会干重复的事情了,这也相当于我们手算时的思路!
反转单链表
如题,入门级算法,来一发吧,回来再写一遍吧,基本思路就是倒转指针,用一个辅助指针先记录下来后驱,总共需要三个辅助指针,代码如下:
判断一字符串是不是对称的
题目非常简单,如题所示,直接上代码吧,其他的都省略了。
判断两个链表是否相交并且返回第一个交点
如题,判断两个链表是否相交并且返回第一个交点,主要的考点在于两个链表交叉后,以后的部分都是一样的,只可能是Y型的交叉而不可能出现X型的交叉
首先定义节点:
如果这么写,那么那么你跪了,面试官肯定会认为你差劲的,而应该如下解决
如果这么写呢,估计面试官就会面带微笑了!
判断单链表是否有环,若有请找出入口
如题,判断单链表是否有环,若有请找出入口。这道题其实是一道脑经急转弯性质的题目,暴力去做是有的,可是要效率哦。
压缩字符串如aaabbbcccc为a3b3c4
如题,好像不是很难,把一串字符串进行压缩,可是要考虑效率哦。
匹配两个字符串的最大子串
当时写的有点low,使用了Java的contains方法,不断从找寻第二个字符串的子串进行配对,考官勉强给我通过,后面回来自己重写了一下,避免了contains函数,如下
输出结果为
cmds
时间复杂度为O(N2),虽然效率不高,但是总算是写了出来,记录一下!
不想敲代码就到我的git来拉一下吧~https://github.com/gordon-rawe/algorithmSummary