您的位置:首页 > 编程语言 > C语言/C++

Java/C++面试手撕算法汇总

2017-09-15 22:40 211 查看
面试手撕算法汇总

1.数组中找出所有重复数字?空间复杂度为O(1),时间复杂度最小?

实在没有O(1)的方法,只能实现O(n),欢迎讨论。

方案1:创建n个数字的数组,循环相加,将大于1的数字打印出来

方案2:map,先contains判断,存在就打印,不存在就put

2.一个二维数组只含0,1;将1围成的矩阵中所有的0的数字转换成1?

首先,题主你的问题其实就是一个上的矩阵能否变成全是1的形式首先,
任意一个域上的矩阵都可以通过三种初等操作变成相抵标准型(就是只有对角线是1和0,其余位置全是0的形式):
1把一行的元素乘以一个数加到另一行上去
2任意一行乘以一个非0的数
3交换任意两行
但是只有两个元素,所以操作2和操作3都可以通过操作1来完成操作2说乘以一个非0的数,但是只有两个元素0和1,一个不让乘,
一个乘了也没用,所以操作2就是个假操作操作3说交换两行,我们把要交换的两行写作向量a和b,
则,运用操作1,把a行加到b行上去,变成(a,a+b),然后再把现在的b行加回a行,变成(2a+b,a+b),
注意我们在中,所以2a=0,故(2a+b,a+b)=(b,a+b),再把现在的a行加到b行上,并注意到2b=0,得到(b,a),
从而完成操作3所以仅使用操作1,我们就可以把一个上的矩阵变成它的相抵标准型假如这个矩阵秩为1,
则该矩阵可以变成一个只有左上角那个位置是1,其余位置全是0的矩阵,此时要变成每个位置都是1应该是一件很easy的事情,
就不赘述了假如这个矩阵可以只通过操作1变成每个位置全是1,那么它就是一个秩为1的矩阵所以秩为1是等价条件


3.求链表中间节点(或者K等分点)?

可以采取建立两个指针,
一个指针一次遍历两(K个或者)个节点,另一个节点一次遍历一个节点,
当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置,
这种解决问题的方法称为快慢指针方法。
(面试尽量用这种方式,能够提高印象分)


4. 手写常用设计模式(单例)

饿汉懒汉的区别、好处、缺点都要会

这里可能会引申出单例的条件,详见:http://www.runoob.com/design-pattern/singleton-pattern.html

5.手写生产者消费者模式?

http://blog.csdn.net/monkey_d_meng/article/details/6251879/

不解释,不理解的,先背住再好好理解

6.100个0到100之间的整数排序

7.two sum问题到k sum问题

8.旋转数组二分查找

9.算 a + b, 不能用加号或减号

10. 数组中超过一半的数

11. 大文件100亿个数字,求前m大的数

12.两个有序数组,求第k个数

13.最大连续子数组和

14.二维数组中,每个元素有个数字,求某一个点到任意一点的sum和(只能向右或者向下) dp记录到每个点的sum

15.手写快速排序算法,并解释过程。

16.重建二叉树

17.二分查找

18.从字符串中“aecbcda”找出不重复的字符组成的顺序子串“aecbd”,用最优的时空复杂度。

19.判断一个链表是否有环(我回答快慢指针,因此引出下一个问题)

20.一个数组,有正有负,把正的移到右边,负的移到左边。

21.两个队列实现栈

22.括号匹配

23.链表反转的操作,参数结构自己设计

24.一个数组,实现原地反转

25.一个只包含小写字母的字符串,去重生成一个只包含单一字母的字符串。例如“abadcab”变成"abdc",只让用最多一个额外的int变量

26.大数加法代码

27.推排序

28.给一个字符串,由26个英文字母组成,判断其中有没有重复出现的元素,有返回true,没有返回false
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: