All

环形链表—LeetCode141
2019 年 12 月 21 日
题目描述 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = \[3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = \[1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = \[1], pos = -1 输出:false 解释:链表中没有环。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗?
Java古老的集合类之Hashtable
2019 年 12 月 20 日
Hashtable虽然现在不经常被用到,但是它作为Java最早的集合类,今天来看一下它的源码。 首先说明一个问题,在Java中大部分都是驼峰式写法,但是Hasbtable并没有采用这种写法。 继承与实现关系 1 2 3 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {} 可以看出它继承的是Dictionary与HashMap并不是同一个父类。但是它也实现了Map,Cloneable,Serializable接口。说明它可以被克隆,可以执行序列化。 变量 1 2 3 4 5 6 7 8 9 private transient Entry<?,?>[] table; private transient int count; private int threshold; private float loadFactor; private transient int modCount = 0; 来一个一个的解释每一个变量的意义: table 与HashMap一样,利用数组作为底层的存储容器,并且添加了关键字transient。这个关键字的意思是在进行序列化的时候不会被序列化。这个关键字具体可以看一下这篇文章。 count 表示容器中存储的数量 threshold 扩容阈值,当容器中的数量到达这个值后会进行扩容机制。这个值默认情况下为 (capacity* loadFactor) loadFactor 扩容系数,默认为0.75f。 modCount 修改次数,当增加或删除时,这个值会进行加一。表示这个容器结构修改的次数。这个变量在迭代,序列化等操作、多线程的操作下都尽量保证了安全性。
简单项目 首先我们建立一个项目,它作为我们的全部项目的容器,并负责公共依赖的版本管理等。 项目结构是这样的: 然后我们在pom.xml中导入我们所需要的依赖,我们全部使用 springboot 来启动项目,并且需要修改packaging的方式为pom。最终的文件如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>learn.spring.cloud.eureka.demo</groupId> <artifactId>learn-spring-cloud-eureka</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>simple-parent</name> <description>学习eureka</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
将链表转换为树
2019 年 12 月 15 日
题目来源 今天做了个题: 将一个链表里的数据组装树形结构,链表里的数据已经满足树形结构要求 这道题描述的很简单,但是有很多种情况。他只说了链表数据满足树形结构要求,并没有说明数据到底是什么样的,也就是题目参数具有多样性,这样其实我们给出一种解决方案就可以。而且也只要求将链表转换为树,并没有说是什么树。所以这道题说难也难,说简单也简单。 解题思路 最近也将平衡二叉树的原理看了一下,正好借着这道题将代码手写一下。 我写了一个平衡二叉树的插入方法。我们不管链表里面的数据是如何排序的,我们只要调用树的插入方法即可。在插入方法内部实现树的平衡。 所以我们这道题也就转换成了手写平衡二叉树的插入过程。
移除元素-LeetCode27
2019 年 12 月 14 日
题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
AVL,红黑树学习
2019 年 12 月 09 日
二叉树 定义 二叉树由节点的有限集合构成 这个有限集合或者为空集 或者为由一个根节点(root)及两棵互不相交、分别称为这个根的左子树和右子树的二叉树组成的集合 在 java 中用代码定义为: 1 2 3 4 5 6 7 8 class TreeNode { Object val; TreeNode leftNode; TreeNode rightNode; ... } 性质 在二叉树中,第 i 层上最多有2^i^ 个节点(i>=0) 深度为 k 的二叉树至多有2^k+1^-1个节点(k>=0) 有 n 个节点的完全二叉树的高度为 log2(n+1) 它主要有五种基本形态: 满二叉树 定义:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。 大体的意思就是:一颗二叉树的节点要么是叶子节点(也就是最后一层),要么它就要有两个子节点。如果这个二叉树的层数为 k,且节点总数是(2^k^-1),则它就是满二叉树。 完全二叉树 定义:设二叉树的深度为 k,除第 k 层外,其他各层(1~(k-1)层)的节点都都达到最大值,其第 k 层所有的节点都连续集中在最左边,这样的树就是完全二叉树 这些是二叉树的一些基本定义以及变形,它对于数据的存储并没有要求,只是要求了结构。所以对于实际应用中还存在很多的不足,比如对于一个 n 个节点的树,判断一个节点是不是在树里面,它的复杂度还是 o(n)。所以我们下面介绍几种对于存储有要求的树。
Java注解
2019 年 12 月 06 日
注解,这个经常在开发中使用到的东西,它的使用语法是怎么样的?如何去自定义一个注解呢? 什么是注解 我们在日常开发中,比如 java 中的@Override,在 springboot 中用到的@SpringBootApplication等一系列标注在类或者方法上的注解。我们添加上注解后会有对应的事件处理,比如我们的@Override注解标明这个方法是重写了父类或者接口的方法,当参数不一致、返回类型不一致等不符合重写的要求时,编译器会报错。类似的@SpringBootApplication也是标明这个项目的一个 springboot 项目,默认会启动一个 tomcat 容器等。 注解是从 jdk5 开始引入的新特性。 注解的语法 1 public @interface FirstAnnotation {} 通过@interface即可声明一个注解。
K个一组翻转链表-LeetCode25
2019 年 11 月 27 日
题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明 : 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换 解题思路 首先根据 k,分隔每一组。将这一组反转,将下面的一组递归调用函数,然后将这一组的最后一个节点(就是参数中的头结点)与下一组反转后的头结点相连接。
反转一个单链表-LeetCode206
2019 年 11 月 24 日
题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?