![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
Princess$
不一定逆风翻盘,但一定向阳而生
展开
-
java——单链表方法实现
/** * 单链表 */class Node{ public int data; public Node next; public Node(int data){ this.data = data; this.next = null; }}public class MyLinkedList { public Node head;//保存头节点的引用 // 1、无头单向非循环链表实现----------------.原创 2021-02-10 18:05:56 · 89 阅读 · 0 评论 -
静态代码块/实例代码块/不带参数的构造方法/带参数的构造方法 执行顺序
class Animal{ public String name; public int age; public Animal(){ this("dog",4); System.out.println("这是一个默认构造方法"); } public Animal(String name, int age) { this.name = name; this.age = age; Sys.原创 2021-02-10 17:43:48 · 130 阅读 · 0 评论 -
数组的逆置方式:两种
方法一 public static void reverse(int[] array){ int left = 0; int right = array.length - 1; while (left < right){ int tmp = array[left]; array[left] = array[right]; array[right] = tmp;原创 2021-02-10 17:10:25 · 434 阅读 · 0 评论 -
数组的拷贝方法
方法一:for循环手动拷贝 private static int[] copyArray(int[] array) { int[] temp = new int[array.length]; for (int i = 0; i < array.length; i++){ temp[i] = array[i]; } return temp; }方法二:Arrays.copyOf public stati原创 2021-02-10 16:23:35 · 1117 阅读 · 0 评论 -
归并排序详细解说
思路分析归并排序:是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。图解代码示例1)递归方法//有两个重要的特点,可以适用于外部排序(数据在磁盘上),也可以适用于链表排序 // (希尔,堆排序,快速排序依赖随机访问能力,都不适合链表排序) //基本思路来源于基本问题:把两个有序链表/数组合并成一个 //[low,mid) 有序区间 //[mid,h原创 2021-02-09 00:36:04 · 164 阅读 · 0 评论 -
快速排序详细解说
思路解析1)取最右侧的值为基准值base,从数组的左右两边分别开始查找,先从左往右找比基准值大的值,再从右往左找比基准值小的数,找到之后,将两个找到的数进行交换2)在继续刚才的步骤,继续进行交换3)直到left和right重合,就把重合的位置与基准值base交换4)交换之后,原理的base就到了之前的重合位置,然后以这个数为分界线,分成左右两边,并对着两边的数组分别进行上述操作(递归)代码示例1)递归实现 public static void quickSort(int[] array原创 2021-02-09 00:16:37 · 194 阅读 · 0 评论 -
二叉搜索树基本操作
1.二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树2.插入元素思路首先应该找到合适的位置,如果发现插入的元素重复了,就插入失败,返回false,插入成功返回true。(只能插入尾部,不能插入到中间)代码 //插入 public boolean insert(int key){原创 2021-02-06 19:10:36 · 353 阅读 · 8 评论 -
冒泡排序详细解说
思路分析冒泡排序是每次找到一个最大值或者最小值,放到合适的位置上,借助相邻元素比较交换的方式来完成。具体思路如下:用cur和cur+1两个位置进行比较,如果cur大于cur+1位置的值,那么就将两个位置的值交换,之后让cur+1继续比较交换,直到cur+1等于数组长度的时候为止,这样就可以把整个数组中最大的元素找到,放到了数组末尾,到此就已经完成了第一趟排序。接着重复以上过程,直到整个数组排序完成/图解代码示例方法一:从前往后进行遍历,就是每次找最大 public static voi原创 2021-02-05 15:46:37 · 652 阅读 · 6 评论 -
堆排序详细解说
思路分析堆排序的过程如下:由于利用小堆会占用额外空间,因此先将一个堆按照大堆的方式进行创建,然后取堆顶元素与堆中的最后一个元素进行交换,接着将最后一个元素出堆,将剩余的元素进行向下调整,重新调整成一个大堆,接着再重复以上操作,知道排序完成。注意:排升序要建大堆;排降序要建小堆图解代码实现 public static void heapSort(int[] array){ creatHeap(array); for (int i = 0; i < ar原创 2021-02-05 01:12:50 · 250 阅读 · 0 评论 -
选择排序详细解说
思路分析选择排序是每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的bound位置,直到全部待排序的数据元素排完 。本文章中以升序为例,让已排序的序列中的最后一个元素为bound,让cur初始值为bound+1(就是未排序的第一个元素),然后和bound位置的值进行比较,如果bound位置的元素大于cur位置的元素,就交换顺序,再让cur往后走,如果遇到比bound位置小的元素就继续交换,直到走到数组末尾,就完成了第一次排序,依次类推让bound+1,继续上述过程,就可以完成整个排序过程。原创 2021-02-05 00:41:16 · 273 阅读 · 2 评论 -
希尔排序详细解说
思路分析希尔排序的主要实现逻辑还是基于插入排序的,插入排序的过程在上一篇文章中讲过啦,如果有兴趣的老铁可以查看以下文章:插入排序详细解说了解了插入排序后,希尔排序就可以迎刃而解了可以将整个数组分为gap组,这里的gap=array.length/2,然后进行插入排序,再将gap/2,再次进行插入排序,直到gap=1的时候,就可以得到最终的已排序数组图解代码实现public static void shellsertSort(int[] array){ int gap = arr原创 2021-02-04 23:11:05 · 329 阅读 · 10 评论 -
插入排序详细解说
思路分析插入排序是将整个区间被分 有序区间和无序区间。每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入我们这里使用bound来作为无序区间的第一个元素,需要将这个元素和前面的每一个元素依次进行比较,此处排出来的顺序应该为升序,也就是将bound元素放到合适的地方即可此处令cur为bound的前一个元素,如果cur与bound比较,bound小与粗人,那么就将cur往后移一位(bound位置的元素事先存起来,以保证不被覆盖),然后将cur减一,再与之前存好的bound元素进行比较,直到放到合原创 2021-02-03 00:33:03 · 255 阅读 · 6 评论 -
TopK问题
典型问题 :给定一个100亿(N)个数字,让你找出其中前1000(M)大的数字两种不同解决方案:1.用一个数组保存刚才的那些数字,直接在这个数组上建大堆,循环1000次进行取堆顶元素+调整操作,就能得到前1000大的元素:O(N)+O(M+logN)2.先取集合中的1000个元素放到一个数组中,建立一个小堆,建立一个大小为1000的小堆,堆顶元素就是前1000大元素的守门员,再一个一个遍历集合中的数字,依次和守门员进行比较,如果这个元素比守门员大,就把守门员删掉,再把当前的元素入堆,当遍历完所有元原创 2021-01-30 21:48:41 · 71 阅读 · 0 评论 -
堆的基本概念
堆是什么1.是一种特殊的二叉树(完全二叉树)2.通过数组的方式顺序存储3.对于这个数的任意节点来说,满足根节点大于左右子树的值(大堆),或者任意一节点满足根节点的值小于左右子树的值(小堆)堆能干啥1.能高效得找出一个集合的最大/最小元素(堆顶元素)2.能高效得找到前K大/前K小的元素(topk问题)核心操作向下调整 & 向上调整1.向下调整(以大根堆为例)时间复杂度:O(logN) (size固定,child每次乘以2) //按照大堆来实现 //向下调整原创 2021-01-30 00:40:57 · 948 阅读 · 2 评论 -
队列的几种变化和不同种类
1.普通队列:先进先出。2.带优先级的:(优先队列:本质上是二叉树)按照顺序进,出队列的时候出优先级最高的元素,如果优先级相同,再按照先进先出的方式。3.带类型的:业务上的类型,与具体场景密切相关,入队列按照原来的顺序入,出队列按照类型取数据,相同类型元素再先进先出。4.阻塞队列:线程安全版本队列(当队列为空,再去取元素就会发生阻塞;当队列为满,再去插入元素也会发生阻塞)5.无锁队列:线程安全版本队列,不用管锁就能保证线程安全。...原创 2021-01-29 17:02:54 · 1710 阅读 · 0 评论 -
根据一棵树的中序遍历与后序遍历构造二叉树。
题目要求根据一棵树的中序遍历与后序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如,给出//中序遍历 inorder = [9,3,15,20,7]//后序遍历 postorder = [9,15,7,20,3]//返回如下的二叉树:// 3// / \// 9 20// / \// 15 7代码 private int index2; public TreeNode buildTree(int[] preorder, in原创 2021-01-27 17:08:00 · 307 阅读 · 0 评论 -
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
题目你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4] 1 / \ 2 3 / 4输出: “1(2(4))(3)”//解释: 原本将是“1(2(4)())(3())”,//在你省略所有不必要的空括号对之后,//它将是“1(2(4))(3)”。代码pub原创 2021-01-27 17:05:46 · 217 阅读 · 0 评论 -
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。代码 private TreeNode2 lca = null; public TreeNode2 lowestCommonAncestor(TreeNode2 root, TreeNode2 p, TreeNode2 q) { if (root == null){ return null; } findN原创 2021-01-26 22:49:26 · 254 阅读 · 0 评论 -
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”代码 private TreeNode2 lca = null; public TreeNode2 lowestCommonAncestor(TreeNode2 root, TreeNode2 p, TreeNode2 q) { i原创 2021-01-26 22:16:36 · 462 阅读 · 0 评论 -
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]代码 static List<List<Integer>> result = new ArrayList<>(); public原创 2021-01-26 21:42:08 · 1140 阅读 · 0 评论 -
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
题目编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。 建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。代码 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext原创 2021-01-26 21:38:45 · 1877 阅读 · 0 评论 -
判断是否为完全二叉树
解题思路完全二叉树看起来就是一个“满二叉树右下角缺了一块”需要引入一个标志位来区分两个阶段针对一个完全二叉树,进行层序遍历,会出现两种阶段1)任何一个节点都一定有左子树和右子树。当遇到某个节点只有左子树没有右子树的时候,那么就切换到第二阶段;如果只有右子树没有左子树的时候,那么就一定不是二叉树2)任何一个节点,一定没有子树当遍历符合以上要求的时候,整个树就是完全二叉树代码实现import java.util.LinkedList;import java.util.Queue;cla原创 2021-01-26 20:09:59 · 570 阅读 · 0 评论 -
二叉树简单题:求二叉树节点个数/求二叉树叶子节点的个数/求二叉树第k层节点的个数/在二叉树中查找指定的元素
package day_21_1_24;class Node { public char val; public Node left; public Node right; public Node(char val) { this.val = val; }}public class TestTree { public static Node build(){ //手动把一颗树构造出来 Node a =原创 2021-01-24 22:56:53 · 220 阅读 · 0 评论 -
给定一个二叉树,检查它是否是镜像对称的。
题目给定一个二叉树,检查它是否是镜像对称的。思路分析判断二叉树是否镜像对称==>(左子树的右节点等于右子树的左节点)&&(右子树的右节点等于左子树的左节点)代码 public boolean isSymmetric(TreeNode root) { if (root == null){ return true; } return isMirror(root.left, root.right);原创 2021-01-24 22:51:52 · 344 阅读 · 0 评论 -
给定一个二叉树,判断它是否是高度平衡的二叉树。
题目给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1解题思路需要遍历计算出二叉树的深度,用左子树的最大深度减去右子树的最大深度的绝对值,如果结果大于1,那么就不是平衡二叉树,反之则为平衡二叉树。代码 //给定一个二叉树,找出其最大深度。 //二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 //说明: 叶子节点是指没有子节点的节点。 public int maxDept原创 2021-01-24 22:48:03 · 632 阅读 · 0 评论 -
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙
题目给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。(s 也可以看做它自身的一棵子树)解题思路如果根节点就相同,那么需要判断一下两个根节点的子节点是否都相同。如果根节点不同,就递归判断子节点代码 public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null){原创 2021-01-24 22:44:31 · 263 阅读 · 0 评论 -
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
题目给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。解题思路先比较根节点的值是否相同 && 左子树相同 && 右子树相同代码public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null){ return true; }原创 2021-01-24 22:40:02 · 167 阅读 · 0 评论 -
给定二叉树的根节点root,请用先序/中序/后序遍历分别返回其节点值
题目要求给定二叉树的根节点root,请用先序/中序/后序遍历分别返回其节点值代码class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val) { this.val = val; }}public class TestTree2 { //给你二叉树的根节点 root ,返回它节点值的 前序原创 2021-01-24 22:38:06 · 2137 阅读 · 0 评论 -
二叉树的先序遍历 中序遍历 后序遍历 层序遍历
两种特殊的二叉树完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树二叉树的遍历先序遍历 :先遍历根节点,再遍历左节点,最后遍历右节点原创 2021-01-24 22:34:10 · 748 阅读 · 1 评论 -
使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空
思路创建两个队列A和B,先将元素入A队列,元素入队列后,再依次出队列到B中,直到A中的元素剩下最后一个的时候,再将这个元素出队列,就可以完成栈中的后进先出的过程代码public class TestDemo21_2 { private Queue<Integer> A = new LinkedList<>(); private Queue<Integer> B = new LinkedList<>(); /** Push ele原创 2021-01-21 18:36:52 · 1022 阅读 · 0 评论 -
给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
题目分析1.如果当前字符为左括号({ [,就把当前字符入栈2.如果当前字符为右括号,取出栈顶元素,看看栈顶元素和括号类型是否匹配a)如果匹配,就把栈顶元素出栈,继续取下一个字符b)如果类型不匹配,就说明非法3.遍历完整个字符串之后,看栈中的内容是否为空,如果为空就为合法的代码```javapublic class TestDemo21_1 { public boolean isValid(String s) { //1.先创建一个栈 Stack&l原创 2021-01-21 17:55:44 · 1484 阅读 · 0 评论 -
队列的两种实现方法
概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头当head==tail时情况1:栈为空情况2:栈为满用链表的方式形成队列public class MyQueueByLinkedList { //Node 这个类叫做内部类 static class Node{ public int val; Node next = null;原创 2021-01-20 00:17:53 · 311 阅读 · 0 评论 -
堆栈的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据在栈顶使用顺序表的方式实现//栈操作public class MyStack { //管理一些int元素即可,不考虑扩容问题 private int[] array = new int[100]原创 2021-01-19 23:58:26 · 98 阅读 · 0 评论 -
java——ArrayList和LinkedList的区别以及List的实现
ArrayList和LinkedList有什么区别:1.ArrayList底层结构是顺序表(基于数组);LinkList是链表;2.ArrayList数据存放在内存空间上;LinkList不是存放在连续的内存空间上;3.ArrayList能够高效的进行 “随机访问 ” ,按照下面操作时间复杂度是O(1);4.LinkList能够高效的进行插入删除,时间复杂度为O(1)5.Array...原创 2020-05-06 23:44:30 · 427 阅读 · 1 评论 -
包装类
基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean原创 2021-01-18 18:41:21 · 67 阅读 · 0 评论 -
什么是泛型
引出问题在之前的顺序表中,如果定义了一个int类型的顺序表(或这说是数组),就只能存储整数,这样显然是不合适的。应该让这个类同时存储多种类型的数据,就引出了“泛型”这样的概念Object类Object是所有父类的子类,在某种意义上也可以代替泛型进行使用,但是在使用的过程中也会出现一些问题:例如以下代码使用Object来实现的public class TestDemo0118_1 { //如果刚开始定义的时候不用 private Object[] data = new Object原创 2021-01-18 17:55:26 · 168 阅读 · 2 评论 -
java数据结构——集合框架及Collection、Map接口的介绍
1.集合框架Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组 接口 interfaces 和其实现类 classes 。类和接口总览其中,Collection 和 Map 接口是常用接口2.Collection接口图中接口解释:Collection :用来存储管理一组对象 obj...原创 2020-05-06 18:13:14 · 196 阅读 · 0 评论 -
java——异常时try catch finally的用法 出现异常之后典型的处理方式
处理异常在程序运行过程中通常会遇到以下异常:空指针异常/数组下标越界异常…所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制.处理异常的格式为:try{异常代码}catch{异常的处理}finally{异常的出口(无论是否触发异常,都一定会执行)}try 代码块中放的是可能出现异常的代码.catch 代码块中放的是出现异常后的处理行为.finally 代码块中的代码用于处理善后工作, 会在最后执行.其中 catch 和 finally 都可以根据情况选择加或者原创 2020-12-05 11:26:15 · 929 阅读 · 2 评论 -
java——String,StringBuffer 和 StringBuilde的区别
StringBuffer 和 StringBuilde任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类这里的两个类大致一样,下面用StringBuilde来举例说明1.添加字符串:append()StringBuilder stringBuilder = new String原创 2020-12-03 13:22:03 · 292 阅读 · 1 评论 -
java——String中的大小写字母的转换 substring()方法的介绍
1.substring()从一个完整的字符串之中截取出部分内容。可用方法如下:String str = "helloworld" ;System.out.println(str.substring(5));System.out.println(str.substring(0, 5));注意事项:索引从0开始注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标2.toUpperCase() 与 toLowerCase()String原创 2020-12-03 12:59:33 · 918 阅读 · 0 评论