
算法题目
gsub
简简单单,开心就好
展开
-
十一.把链表分为小中大三个部分
【题目】将单向链表按某值划分成左边小、中间相等、右边大的形式【要求】1.要求每部分里的节点从左 到右的顺序与原链表中节点的先后次序一致。2.时间复杂度请达到O(N),额外空间复杂度请达到O(1)。【分析】因为要求稳定性,空间复杂度O(1),所以快速排序不行。1.提供三个容器(small,equal,big);2.每个容器里面有两个节点变量(一个头结点,一个尾节点),以小于为例,找...原创 2019-05-13 22:08:26 · 296 阅读 · 0 评论 -
十.打印两个有序链表的公共部分
【题目】给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。【思路及代码】public static void printCommon(Node head1,Node head2) { while(head1!=null&&head2!=null) { if (head1.value==head2.value) { System.out...原创 2019-05-13 16:57:40 · 96 阅读 · 0 评论 -
一.数组实现固定大小的栈和队列
1.用数组结构实现大小固定的栈分析:栈是先进后出的结构,存进去的是12345,那么弹出的要是54321.思路:1.创建一个数组,数组的长度是固定的(用来实现大小固定的栈);2.要有一个指针(指向的是数组的第一个空位置),用来指示数据进栈的下标位置,同时指示数据出栈的下标位置。class ArrayStack(){ private int[] arr; int inde...原创 2019-05-09 15:52:12 · 263 阅读 · 0 评论 -
二.队列和栈的相互实现
1.用栈实现队列分析:栈的数据操作是后进先出,队列的操作是先进先出,所以我们想要达成目的,可以用一个辅助的栈;流程:有两个栈,一个是用于添加数据的pushStack,一个是用于弹出数据的popStack;当需要添加数据时,直接加入到pushStack;当需要弹出数据时(队列弹出数据先进先出,所以目的是弹出pushStack栈底的数据),但是我们只能弹出栈顶的元素,这个时候依次弹出pushS...原创 2019-05-09 18:21:23 · 122 阅读 · 0 评论 -
三.猫狗队列
【题目】 宠物、狗和猫的类如下:public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return this.type; }}public class Dog extends Pet { pu...原创 2019-05-10 17:24:56 · 178 阅读 · 0 评论 -
四.转圈打印矩阵
【题目】 给定一个整型矩阵,请按照转圈的方式打印它。例如:1 2 3 45 6 7 89 10 11 1213 14 15 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10【要求】 额外空间复杂度为O(1)。【分析】看整体,最外面一圈(顺...原创 2019-05-10 21:56:31 · 181 阅读 · 0 评论 -
五.旋转正方形矩阵
【题目】给定一个整型正方形矩阵matrix,请把该矩阵调整成顺时针旋转90度的样子。【要求】额外空间复杂度为O(1)。【流程图】【思路分析】1.找到左上角和右下角的坐标,划分正方形。2.按照顺时针方向交换四个角的坐标。3.左上角和右下角分别向右,向左移动,划分新的正方形,重复上述过程。【代码实现】**//1.划分正方形,确定左上角和右下角坐标**public ...原创 2019-05-11 14:23:17 · 375 阅读 · 0 评论 -
六.“之字”形打印矩阵
【题目】给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,【要求】额外空间复杂度为O(1)。【举例】 ### 【输出结果】1 2 5 9 6 3 4 7 10 11 8 12【分析】1.从宏观结构来看,把整体划分为几个箭头部分;2.从每个箭头表示的数据来看:下一个箭头组边界的数据是上一个箭头组边界数据向下,向右移动得到的;3.相邻箭头组的输出顺序是不一样的。(实现正确...原创 2019-05-12 16:04:48 · 230 阅读 · 0 评论 -
七.在行列都排好序的矩阵中找数
【题目】给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一 列都是排好序的。实现一个函数,判断K是否在matrix中。例如:如果K为8,返回true;如果K为6,返回false。【要求】时间复杂度为O(N+M),额外空间复杂度为O(1)。【分析】【代码】//1.测试public static void main(String[] args) { ...原创 2019-05-12 17:11:14 · 197 阅读 · 0 评论 -
九.反转单向链表和双向链表
【题目】分别实现反转单向链表和反转双向链表的函数【要求】如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)【分析思路及代码实现】反转单向链表:1.找到某一个节点的下一个结点2.找到某一个结点的下一个位置3.把后边的节点都移动到他的前边一位去public static Node reverseList(Node head) { Node pre=null;...原创 2019-05-13 11:41:47 · 196 阅读 · 0 评论 -
八.判断列表是否为回文结构(正序倒序都一样)
【题目】给定一个链表的头节点head,请判断该链表是否为回文结构。例如: 1->2->1,返回true;1->2->2->1,返回true;15->6->15,返回true; 1->2->3,返回false。【思路】【第一种解法】(额外的空间复杂度是O(n))1.准备一个栈,遍历链表中的数据存到栈中;2.再遍历一次链表数据,同时把栈...原创 2019-05-13 12:01:48 · 1365 阅读 · 0 评论 -
十六.二叉树的序列化和反序列化
【题目】二叉树的序列化和反序列化【定义】二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。【思路】一.先序遍历二叉树序列化(递归)1.中间结点的值加入到字符串中2.左边节点的值加入到字符串中(递归)(左边节点作为左子树的中间结点,加...原创 2019-05-16 14:02:48 · 179 阅读 · 0 评论 -
十五.在二叉树中找一个结点的后继结点和先驱结点
【题目】现在有一种新的二叉树节点类型如下:public class Node{public int value;public Node left;//左节点public Node right;//右节点public Node parent;//父节点public Node(int data){ this.value = data; }}头节点的parent指向null。只给...原创 2019-05-16 10:55:13 · 396 阅读 · 0 评论 -
十四.实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式
【题目】实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式【分析】斜体样式先序遍历:中左右非递归的思路:1.建立一个栈存放结点;2.栈中不为空的时候,弹出节点并且打印,相当于打印的是中间的位置;3.先压入的是弹出节点的右节点,在压入左节点(保证弹出的时候左节点先打印)。中序遍历:左中右后序遍历:左右中【先序遍历代码实现】//1.构造节点结构 public static ...原创 2019-05-16 09:04:19 · 385 阅读 · 0 评论 -
十三.复制含有随机指针节点的链表
【题目】一种特殊的链表节点类描述如下:public class Node { public int value; public Node next; publicNode rand;public Node(int data) { this.value = data; }}Node类中的value是节点值,next指针指向下一个节点,rand指针可能指向链表中的任意一个节点,也可能指向n...原创 2019-05-14 17:43:24 · 138 阅读 · 0 评论 -
十二.两个单向链表相交的一系列问题
【题目】 两个单向链表相交的一系列问题在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数, 如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。【要求】如果链表1的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外空间复杂度请达到O(1)。【分析】本题目可以拆分为:问...原创 2019-05-14 15:55:02 · 393 阅读 · 0 评论