算法
我听说大厂面试,考算法,因此有了本专栏
荒野求思
人生就像写代码,总有bug出现
展开
-
第二十八题:如何判断一棵树是一颗全完二叉树?(Java)
题目要求:如标题: 分析:对于二叉树中的任意一个节点,层序遍历二叉树①:如果只有右孩子,没有左孩子,那么该树一定不是完全二叉树;②:第一次发现一个节点有如果左没右,或者左右都没有,那么其后的每一个节点都必须是叶子节点,否则一定不是一颗完全二叉树;package com.isea.brush.tree;import java.util.LinkedList;impor...原创 2019-01-17 11:38:56 · 456 阅读 · 0 评论 -
第二十七题:如何判断一颗树是否是二分搜索树?(Java)
题目要求:如标题:假设该树没有重复的节点分析: 所谓的二分搜索树,就是任意一个节点满足,大于左孩子,小于右孩子。所以二分搜索树满足这样的一个性质:中序遍历之后的二叉树是顺序的。所以我们这里实现的思路是,改写二叉树的非递归版本的,来校验当前值和前一个值的大小关系。代码实现:package com.isea.brush.tree;import java.util.Sta...原创 2019-01-17 10:02:12 · 806 阅读 · 0 评论 -
第二十六题:判断一颗二叉树是不是平衡二叉树(Java)
题目要求:如标题:什么是平衡二叉树?任意节点的左子树和右子树的高度差不超过1,空数也是一颗平衡二叉树。要求:二叉树的节点的个数是N,时间复杂度是O(N)代码实现与分析:一个树是平衡二叉树的条件是,每一个子树都是平衡二叉树。对于node这颗子树,在何时是一颗平衡二叉树?①:左子树不平衡,false②:右子树不平衡,false③:左子树平衡,拿到左子树的高度h1...原创 2019-01-16 21:25:59 · 802 阅读 · 0 评论 -
第二十五题:二叉树的序列化和反序列化(Java)
题目要求:二叉树的数的序列化和反序列话,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失。所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化;将二叉树的数据保存到了磁盘之后,还需要将磁盘中的二叉树的数据加载到内存中去,这过程叫做反序列化。反序列的标准是:如何序列化的,就怎么反序列话。代码实现: package com.isea.bru...原创 2019-01-16 20:17:56 · 1518 阅读 · 1 评论 -
第二十四题:在二叉树中找到一个节点的后继节点和前驱节点(Java)
题目要求:如标题(Node除了left,right,还有一个指向父节点的指针)什么前驱和后继节点? 在二叉树的中序遍历中,一个节点的前一个节点,就是该节点的前驱,一个节点的下一个节点就是该节点的后继。如何寻找一个节点的前驱?如果该节点有左子树,那么该节点的前驱就是该节点左子树中最右边的节点;如果该节点没有左子树,从当前节点开始往上寻找,直到当前节点是其父节点的右孩子,那么这个父节...原创 2019-01-16 19:12:11 · 1293 阅读 · 2 评论 -
第二十三题:如何较为直观的打印一个二叉树(Java)
题目要求如标题代码实现:^ 表示左上方距离最近的是父节点;v 表示距离左下方最近的值是跟节点package com.isea.brush.tree;public class PrintBinaryTree { public static class Node { public int value; public Node lef...原创 2019-01-16 17:05:16 · 472 阅读 · 0 评论 -
第十三题:非递归方法实现二叉树的前序,中序,后序,层序遍历(Java)
题目:请使用非递归的方法,实现二叉树的前序,中序,后序,层序遍历代码实现:附带了递归的实现,即使用递归来测试非递归的实现是否正确。package com.isea.brush.tree;import java.util.LinkedList;import java.util.Stack;public class BinaryTree { private No...原创 2019-01-16 16:48:15 · 423 阅读 · 0 评论 -
第十二题:使用递归完成二叉树的前序,中序,后续遍历(Java实现)
题目:使用递归完成二叉树的前序,中序遍历,后续遍历代码实现:package com.isea.brush.tree;public class BinaryTree { private Node head; private int size; private static class Node { private int data; ...原创 2019-01-11 16:47:23 · 253 阅读 · 0 评论 -
第十题:在行和列都排好序的数组中找数
题目要求:在行和列都排好序的N* M的矩阵Matrix中找数K,也即 判断 K 是否在矩阵Matrix 中例如0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果k 为 7 ,返回true, k 为 6 则返回 false,要求时间复杂度为O(M + N)额外空间复杂度为O(1)...原创 2019-01-10 20:45:57 · 225 阅读 · 0 评论 -
第九题:“之”字形打印矩阵
题目要求:1 2 3 4 5 6 7 8 9 10 11 12 打印之后的结果为:1,2,5,9,6,3,4,7,10,11,8,12代码实现与分析:和我们以往的矩阵题目一样,如果我们总是局限于如果变化下标来处理逻辑的话,边界控制可能写着写着就凉凉了。所以我么需要从较为宏观的角度去思考这类问题。packag...原创 2019-01-10 16:40:29 · 258 阅读 · 0 评论 -
第七题:将N * N的举证(正方形)顺时针旋转90度
题目要求:将N * N的举证(正方形)顺时针旋转90度,如下图,将左边的矩阵旋转为右边的矩阵; 要求额外空间复杂度为O(1),也即原地旋转。1 2 3 7 4 1 4 5 6 8 5 2 7 8 9 9 6 3 代码实现与分析:package com...原创 2019-01-09 22:38:39 · 541 阅读 · 0 评论 -
第六题:转圈打印矩阵
题目要求:转圈打印矩阵,比如下面的这个矩阵:1 2 5 6 5 44 37 76 9 4 77 23 8 10 33 4 88 7 4 3 打印的顺序是:1,2,5,6,5,4,33,3,4,7,88,4,77,44,37,76,9,10,8,23。要求:空间复杂度为...原创 2019-01-09 21:04:01 · 218 阅读 · 0 评论 -
第五题:反转字符串
题目要求:字符串反转 比如将 dog to cat 反转为 cat to dog代码实现:package com.isea.brush;/** * 字符串反转 比如将 dog to cat 反转为 cat to dog * * 如果不存在类似的split方法的话,思路是,先将字符整体反转为 :tac ot god 然后 * 在对每个单词进行逆序,dog to cat...原创 2019-01-07 21:25:53 · 282 阅读 · 0 评论 -
第二十一题:实现对一个带有随机指针的链表的拷贝(Java)
题目要求:一个链表除了带有next指针指向下一个元素之外,还有另外一个指针rand,该指针随机指向链表中的任意一个节点,现在要求对这个链表进行深度的拷贝,返回拷贝了之后的链表的头结点。思路分析与代码实现: package com.isea.brush;import java.util.HashMap;/** * 实现对一个带有随机节点的链表的拷贝 * 准备一个辅助的映...原创 2019-01-16 09:28:42 · 264 阅读 · 0 评论 -
第二十题:链表的荷兰国旗问题(Java)
题目要求将一个链表,按照某一个标准,小于该标准的放置在链表的前面,等于的放置在中间,大于的放置在后面,不要求稳定性。实现思路:在前面第十五题:荷兰国旗问题中,我们已经解决了类似的问题,我们实现的思路是,遍历整个链表,然后将每一个节点放置到数组中去,然后使用荷兰国旗问题的思路来解决,在数组荷兰国旗话之后,在遍历数组,将数组转为链表,在笔试中,我们应该使用这样的解决方案。代码实现:...原创 2019-01-15 21:18:10 · 424 阅读 · 0 评论 -
第十一题:判断一个链表是否为回文结构(Java实现)
题目:给定一个链表的头结点是head,请判断该链表是否为回文结构例如:1->2->1,返回true1->2->2->1,返回true1->2->3,返回false分析:在链表问题中,时间复杂度一般都是O(n)的,所以链表的优化一般在空间复杂度上的优化,在笔试和面试中,面对链表的问题,我们的策略是不一样的,如果是在笔试中,不用...原创 2019-01-10 22:09:51 · 1916 阅读 · 1 评论 -
第八题:翻转双向链表
题目:翻转双向链表,时间复杂度为O(N),额外空间复杂度我O(1)。代码实现与分析:package com.isea.brush;/** * 反转双向链表 */public class ReverseDoubleList { private static class DNode { private int data; private ...原创 2019-01-09 23:16:34 · 252 阅读 · 0 评论 -
第三题:翻转单向链表
题目要求:如果链表的长度为N,要求时间复杂度为O(N),额外空间复杂度为O(1)代码实现与分析: package com.isea.brush;/** * 翻转单向链表? * 要求:如果链表的长度为N,要求时间复杂度为O(N),额外空间复杂度为O(1) * 解题思路: * head: 表示当前链表的头结点 * pre: 表示头节点的前一个节点 * cur: 表示当前节...原创 2019-01-07 19:40:04 · 203 阅读 · 0 评论 -
第十九题:如何使用队列实现栈结构(Java)
题目要求:如标题代码实现与分析:在图的深度优先遍历中,是需要使用栈结构来实现的,在面试中可能会被问到,如何仅用队列结构来实现图的深度优先遍历?package com.isea.brush;import java.util.LinkedList;import java.util.Queue;/** * 使用队列结构实现栈 * 实现思路: * 使用两个队列;dat...原创 2019-01-14 23:47:20 · 431 阅读 · 0 评论 -
第十八题:使用数组实现固定长度的队列(Java)
题目要求:如标题代码分析与实现: package com.isea.brush;/** * 使用数组实现长度队列结构 * start:队首,拿取一个数,要存放的位置 * end: 队尾,新加一个元素,应该放在哪个位置,只要end到了数组的长度-1,就回到开头 * size: 队列中的元素的个数 * 用来约束start和end,只要size没有到达数组的长度,就可以...原创 2019-01-14 22:51:56 · 683 阅读 · 0 评论 -
第十七题:使用数组结构实现大小固定栈(Java)
题目要求:如标题代码实现:package com.isea.brush;/** * 使用数组结构实现固定长度的栈结构 * 实现思路:index位置表示的是如果要入栈,元素应该存放数据的位置 */public class ArrayStack { private Integer data[]; private int index; public...原创 2019-01-14 21:28:20 · 258 阅读 · 0 评论 -
第四题:猫狗队列问题
题目要求:现有猫狗类如下:class Pet{ private String type; public Pet(String type){ this.type = type; } public String getType() { return type; }}class Dog extends Pet{...原创 2019-01-07 21:03:10 · 450 阅读 · 1 评论 -
第二题:如何使用栈实现队列(使用两个栈实现队列)
题目要求:编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) 代码实现与分析:package com.isea.brush;import java.util.Stack;/** * 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) * 实现思路:一个stackData栈用来入栈,一个stackHelp用来出栈,每一...原创 2019-01-07 18:42:47 · 208 阅读 · 0 评论 -
第一题:设计一个有getMin功能的栈
题目要求: /** * 第一道题目:实现一个栈,在实现栈功能的基础上,在实现返回栈中最小的元素的操作 * 要求: * ①pop,push,getMin操作的时间复杂度都是O(1) * ②设计的栈类型可以使用现成的栈结构 代码实现 package com.isea.brush;import java.util.Stack;/** * 第一道题目:实现一个栈,在实现...原创 2019-01-07 18:07:05 · 192 阅读 · 0 评论 -
第十六题:求无序数组排好序后相邻两数的最大差值(Java)
题目要求:给定一个无序的数组,求该数组排好序后的相邻两个数的最大差值,要求时间复杂度为O(n),且不能使用非基于比较的排序,比如:3,1,6,2,7 ,排序序之后是,1,2,3,6,7。两个数的最大差值是 3。代码实现与分析:这个问题实现思路非常的器巧妙,借用了桶的概念,但是没有进行桶排序。package com.isea.brush;/** * 求相邻两个数的最大差值...原创 2019-01-14 21:07:28 · 863 阅读 · 0 评论 -
第十五题:荷兰国旗问题(java)
题目要求:给定一个数组,将这个数组,按照num划分,小于num的元素放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求时间复杂度是O(N),额外空间复杂度是O(1)代码实现:package com.isea.brush;/** * 荷兰国旗问题: * 解题思路:使用两个变量(指针),less 和more,less表示小于num的范围,more...原创 2019-01-14 19:30:58 · 324 阅读 · 0 评论 -
第十四题:小和问题(Java)
题目:小和问题:在一个数组中,每一个数左边比当前小的数累加起来,叫做这数组的小和,求一个数组的小和,如:【1,3,4,2,5】1左边比1 小的数,没有3左边比3 小的数,14左边比4 小的数,1,32左边比2小的数,15左边比5小的数,1,3,4,2所以小和是,1 + 1 + 1 + 2 + 3 + 3, + 4 = 16 代码实现与分析:packag...原创 2019-01-14 18:49:50 · 409 阅读 · 0 评论