java
文章平均质量分 61
顾12138
学习者
展开
-
构造平衡二叉搜索树(AVL)(Java实现)
构造平衡二叉搜索树(AVL)(Java实现)定义在之前的博客中提到过,二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,引入了平衡二叉搜索树。当向二叉搜索树中插入新结点后,保证每个结点的左右子树高度之差的绝对值不超过1。特性一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)如果一棵二叉搜索树是高度平衡的,它就是AVL树原创 2021-03-18 10:21:59 · 244 阅读 · 0 评论 -
Java基础知识总结(二) ——泛型
Java基础知识总结(二) ——泛型1. 为什么要有泛型?先来看一下在没有引入泛型之前的场景:假设我们要用list来存储学生的成绩。public static void main(String[] args) { ArrayList list = new ArrayList(); // 存放学生成绩 list.add(78); list.add(88); list.add(98); list.add(88)原创 2021-03-07 17:11:04 · 236 阅读 · 2 评论 -
Java基础知识总结(一)
Java基础知识总结(一)1. 关于 JVM 、JDK 和 JRE 的关系JDK: Java Development Kit的缩写,Java开发工具包,提供给Java程序员使用,包含了JRE,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。JRE: Java Runtime Environment 的缩写,Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程序运行的所需环境 ,但是,它不能用于创建新程序。JVM:Jav原创 2021-03-06 17:22:14 · 144 阅读 · 1 评论 -
Java数据类型
Java的数据类型数据类型 :基本数据类型;引用数据类型基本数据类型:数值型(整形:byte,short ,int,long 浮点型:double,float);布尔型;字符型引用数据类型:类,数组,接口注意:(1)类型转换java作为强类型编程语言,不同类型之间的变量相互赋值时,会有严格校验int a=10;long b=20;a=b; //编译出错b=a; //编译通过...原创 2019-10-27 23:15:39 · 111 阅读 · 0 评论 -
二分查找模板及习题练习
二分查找模板及习题练习二分查找:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。但是,二分查找要求线性表具有有随机访问的特点,也要求线性表能够根据中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。二分查找的本质并不是单调性,而是区间内存在某个性质,使左边满足而右边不满足。模板一:查找符合区间的最左边的值(从右往左逼近)public int binarySearch(int l, int原创 2021-03-03 21:05:55 · 315 阅读 · 1 评论 -
构造前缀树(Java实现)
构造前缀树(Java实现)前缀树(TrieTree)定义前缀树:称又Trie树,是一种存储大量字符串的树形数据结构。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,提高查询效率。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。代码实现class Trie { public static class TrieNode { private boolean isEnd; private TrieNode[原创 2021-02-28 23:00:59 · 296 阅读 · 0 评论 -
常见的排序算法之:冒泡排序和选择排序
常见的排序算法之:冒泡排序和选择排序1.冒泡排序1.1原理在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序 。1.2实现 public static void bubbleSort(int[] array) { //i代表需要比较的趟数 for(int i=0;i<array.length-1;i++){...原创 2020-03-30 17:52:22 · 201 阅读 · 0 评论 -
常见的排序算法之:直接插入排序和希尔排序
常见的排序算法之:直接插入排序和希尔排序1.直接插入排序1.1原理整个区间被分为有序区间和无序区间,每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。1.2实现 public static void insertSort(int[] array) { for(int i=0;i<array.length-1;i++){ //va...原创 2020-03-27 14:51:44 · 213 阅读 · 0 评论 -
常见的排序算法之:堆排序
常见的排序算法之:堆排序1.原理排升序要建大堆;排降序要建小堆 。接下来以升序为例进行堆排序。假设堆有n个元素,由于堆的第一个元素一定是最大的元素,因此可以让第一个元素和第n个元素互换,然后对第一个元素执行向下调整。接着,对n-1个元素执行相同的操作,让第一个元素与第n-1个元素互换,然后对第一个元素执行向下调整,依次类推,最后的堆就是从小到大排序好的堆。2.实现 //向下调整 pu...原创 2020-03-18 22:16:01 · 162 阅读 · 0 评论 -
常见的排序算法之:归并排序
常见的排序算法之:归并排序1.原理归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。2.实现1)递归实现 public static void mergeSo...原创 2020-03-14 17:22:51 · 170 阅读 · 0 评论 -
常见的排序算法之:快速排序
常见的排序算法之:快速排序1.原理 1)从待排序区间选择一个数,作为基准值(pivot); 2)Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;3)采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据...原创 2020-03-12 20:39:08 · 138 阅读 · 0 评论 -
Java实现建堆
堆(heap)概念:堆逻辑上是一棵完全二叉树堆物理上是保存在数组中满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆下标关系:已知双亲(parent)的下标,则:左孩子(left)下标 = 2 * parent + 1;右孩子(right)下标 = 2 * parent + 2;已知孩子(不区分左右)(child)下标,则:双亲(parent)下标 =...原创 2020-02-29 21:26:27 · 1359 阅读 · 0 评论 -
构造队列及循环队列(Java实现)
构造队列及循环队列(Java实现)队列定义队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)代码实现链表实现public class Queue { public static class Node{ int val; Node next;原创 2021-02-27 20:15:12 · 147 阅读 · 0 评论 -
构造栈(Java实现)
构造栈(Java实现)定义栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。代码实现顺序表实现public class Stack { private int[] array; private int size; public Stack(int n){ array = new int[n];原创 2021-02-26 17:20:27 · 174 阅读 · 0 评论 -
构造二叉搜索树(Java实现)
构造二叉搜索树定义二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树特性二叉搜索树中最左侧的节点是树中最小的节点,最右侧节点一定是树中最大的节点采用中序遍历遍历二叉搜索树,可以得到一个有序的序列代码实现public class BSTree { //定义Node类 public s原创 2021-02-25 22:10:52 · 1561 阅读 · 1 评论 -
位运算解决“只出现一次的数字”
位运算解决“只出现一次的数字”只出现一次的数字题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例输入: [2,2,1]输出: 1题解相同的数异或为0 :1^1=0任何数与0异或等于其本身 : 1^0=1 public int singleNumber(int[] nums) { int ret=0; for(int num:nums){ ret^=num;原创 2020-08-06 22:26:38 · 398 阅读 · 0 评论 -
Java:String、StringBuffer和StringBuilder的异同
Java:String、StringBuffer和StringBuilder的异同Java中与字符串相关的类主要有String、StringBuffer和StringBuilder,他们主要有什么区别,又为什么会这样呢?结合源码来分析一下。概述String:不可变的字符序列,底层使用char[]存储StringBuffer:可变的字符序列,线程安全,效率低,底层使用char[]存储StringBuilder:可变的字符序列,线程不安全,效率高,底层使用char[]存储Why?String原创 2020-08-02 22:01:19 · 135 阅读 · 0 评论 -
java线程池知识总结(附上思维导图)
java线程池知识总结(附上思维导图)线程池的优点线程池最大的好处就是减少每次启动、销毁线程的损耗 。构造方法及参数意义public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,RejectedExecutionHandler handler)corePoolSize:允许核心线程的最大值maximumP原创 2020-07-10 16:46:20 · 374 阅读 · 0 评论 -
java多线程案例——生产者消费者模型
java多线程案例——生产者消费者模型什么是生产者消费者模型?生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的 。通信机制对于Java中的每一个个对象,对象上关联着一个monitor lock (监视器锁),还关联原创 2020-06-14 23:30:46 · 185 阅读 · 0 评论 -
Java多线程安全
Java多线程安全1. 什么是线程安全在解释什么是线程安全之前,我们先来看一个线程不安全的场景:public class Test { private static long n=0; private static long count=1_000_000_000L; static class Add extends Thread{ @Override public void run() { for(int原创 2020-06-09 23:41:46 · 228 阅读 · 0 评论 -
Java多线程基础知识总结
Java多线程基础知识总结1. 进程 VS 线程进程:是操作系统分配资源的最小单位;是程序的一次动态执行。线程:是操作系统调度的最小单位。2. 创建线程继承Thread类public class ThreadTest { public static void main(String[] args) { Thread t1=new MyThread(); t1.start(); } }class MyTh原创 2020-06-07 00:06:01 · 204 阅读 · 1 评论 -
LeetCode-面试题 17.06. 2出现的次数
LeetCode-面试题 17.06. 2出现的次数题目描述编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。示例输入: 25输出: 9解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次)题解一看到这道题,可能很多人的想法和我一样,去遍历 0 到 n中的每一个数,依次计算2出现的次数。public int numberOf2sInRange(int n) { int count=0; for(int原创 2020-05-18 20:41:40 · 1063 阅读 · 1 评论 -
人民币转换解析
人民币转换解析题目描述1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个...原创 2020-04-27 23:30:42 · 450 阅读 · 0 评论 -
Java中自定义类型如何进行比较
Java中自定义类型如何进行比较假设我们定义了一个Person类,那么如何实现Person类对象的比较呢?class Person{ public String name; public String gender; public int age; public String ID; Person(String name, String gender...原创 2020-04-06 14:49:37 · 414 阅读 · 0 评论