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



面试手撕算法汇总


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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值