遍历

Halo(五)

蹲街弑〆低调 提交于 2019-12-05 08:54:04
ApplicationPreparedEvent 监听事件 Event published once the application context has been refreshed but before any {@link ApplicationRunner application} and {@link CommandLineRunner command line} runners have been called. Spring Boot 2.0 版本中所有的事件按执行的先后顺序如下: ApplicationStartingEvent ApplicationEnvironmentPreparedEvent ApplicationPreparedEvent ApplicationStartedEvent <= 新增的事件 ApplicationReadyEvent ApplicationFailedEvent @Configuration @Order(Ordered.HIGHEST_PRECEDENCE) //最高优先级,最先执行 public class StartedListener implements ApplicationListener<ApplicationStartedEvent> { @Override public void

PTA 树的遍历

喜欢而已 提交于 2019-12-05 08:52:45
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 用数组模拟二叉树,设根结点为n,左孩子编号为2n,右孩子编号为2n+1,以这种方式存储二叉树 按顺序输出则为层序遍历。下面就定义一个数组,然后不断在子递归中查找根结点,将根结点存入相应的数组位置中。 1 //下标从0开始 2 //post[]为已知的后序遍历元素,in[]为已知的中序遍历元素 3 //len-1为传进的post[]的根结点下标,len为在子递归函数(即左右子树)中的元素个数 4 //p为根在num[]中的存储位置,即左右孩子结点成为子递归的根 5 //p的起始位置是1 6 void Levelorder(int post[],int in[],int len,int p) 7 { 8 if(len < 1) //当子树没有元素时,返回 9 { 10 num[p] = -1; 11 return; 12 } 13 14 int i

java面试题-Java集合相关

痴心易碎 提交于 2019-12-05 08:29:48
1. ArrayList 和 Vector 的区别    ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据   Vector是线程安全的,但是性能比ArrayList要低。   ArrayList,Vector主要区别为以下几点:    (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;   (2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;    (3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。 2.说说 ArrayList,Vector, LinkedList 的存储性能和特性    ArrayList采用的数组形式来保存对象,这种方法将对象放在连续的位置中,所以最大的缺点就是插入和删除的时候比较麻烦,查找比较快;   Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.   LinkedList采用的链表将对象存放在独立的空间中

leetcode刷题笔记--第11-20题

。_饼干妹妹 提交于 2019-12-05 07:43:40
11.盛水最多的容器 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明: 你不能倾斜容器,且 n 的值至少为 2。 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 输入: [1,8,6,2,5,4,8,3,7] 输出: 49 解法 时间复杂度o(n) 空间复杂度o(1) 假定初始状态是最左边的垂线和最右边的垂线,需要求的值其实是 min(leftValue, rightValue) * (rightPos - leftPos) 如果想要这个面积继续增加,剩下的组合里肯定只能把一边的垂线向中间靠拢,rightPos - leftPos一定是减少的,那么min(leftValue, rightValue)必须增加才有可能增大面积,所以要将比较小的那条线向中间靠拢, 不断移动,计算直到两条垂线重合 11. 整数转罗马数字 略 12. 罗马数字转整数 罗马数字包含以下七种字符: I , V , X , L , C , D 和 M 。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M

Java集合源码之HashMap

纵饮孤独 提交于 2019-12-05 07:39:27
1. 简介 HashMap是一个哈希表,线程不安全, key 唯一, value 可重复,允许 key 和 value 为null。遍历时是无序的。 底层结构是基于链表散列,也就是数组+链表。数组也被称为哈希桶,桶里面就装着链表,链表中的每个节点,就是哈希表中的每个元素。 在JDK8中,当链表长度达到8的时候,就会转为红黑树。 它实现了 Map<K, V>, Cloneable, Serializable 接口。 接下来我们就来看下源码: 2. 属性 // 序列化ID,用于序列化和反序列化 private static final long serialVersionUID = 362498820763181265L; // 默认初始容量也就是16-必须为2的幂。 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 最大容量。 // 如果两个构造函数都使用参数隐式指定了更高的值,则使用该容量。 // 必须是2的30次方。 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认的负载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; // Entry数组,也就是哈希桶,长度为2的n次幂 transient

算法 - 排序 - 非基于比较的排序

 ̄綄美尐妖づ 提交于 2019-12-05 07:08:16
非基于比较的排序 非基于比较的排序与样本的数据状况有很大的关系,由于这个限制使其在工程中并不常用。 非基于比较的排序有桶排序,基数排序,计数排序。这三者都能做到排序的稳定性,时间复杂度为 O(n),空间复杂度为 O(n)。 问题一:假设存在一组数据,里面的数据只有 0 ~ 60 ,使用非基于比较的排序 思路: 此时可以使用 计数排序 ,准备 61 个桶并编号 0 ~ 60 (具体实现可以是一个长度为 61 的数组,也可以是其他的数据结构,桶只是一个抽象的概念),然后将数据遍历,按照数值放入对应编号的桶中。 按次序遍历桶,如果 0 号桶存放的数字为5,则打印 5 个 0 ,最终就可以得到一个排序的数列。 public static void bucketSort(int[] arr) { if (arr == null || arr.length < 2) return; //由于知道数据的范围,桶的大小才能确定 int[] bucket = new int[61]; //不知道数据的范围 //int max = Integer.MIN_VALUE; //for (int i = 0; i < arr.length; i++) { // max = Math.max(max, arr[i]); //} //int[] bucket = new int[max + 1]; for

DOM深度优先遍历算法

妖精的绣舞 提交于 2019-12-05 07:02:38
通过深度优先遍历算法,可以依次获取每个后代节点的对象。 顺序:有子元素先获取子元素,再获取兄弟元素 主要有2步骤: //1.创建节点迭代器对象(parent是要遍历的节点) var iterator = document.createNodeIterator(parent, NodeFilter.SHOW_ELEMENT, null, false); //2.反复调用iterator的nextNode方法跳到下一个 do{   var node = iterator.nextNode();   if(node != null) console.log(node.nodeName);   else break; }while(true); 以上也可以使用递归实现,但递归效率较低,不建议使用。 来源: https://www.cnblogs.com/1016391912pm/p/11912503.html

Redis 低级数据结构

空扰寡人 提交于 2019-12-05 06:35:05
Redis低级数据结构 简单动态字符串 一般的可变字符串用的都是这个,好处就是返回长度和剩余的长度都是O(1)的复杂度,另外自动提供扩容,不会溢出,另外因为free扩容后会自动预分配一些,阈值在不同情况下是不同的,最大多分配1MB的空间,因此减少了重分配次数,另外减少字符串长度时,除了清掉buf[]中的值,还会修改free的值,并不会主动释放内存空间(提供api释放,不会造成浪费)以便使用时不需要再次分配。 struct sdshdr { //当前长度 int len; //剩余可用长度 int free; char buf[]; } 链表 listNode是一个双向链表对象,list是一个链表的工具类,一般用list。 typedef struct listNode { struct listNode *prev; struct listNode *next; void *value; } typedef struct list{ listNode *head; listNode *tail; unsigned long len; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr,void *key); } 字典 和java的hashmap结构差不多, size代表键值对的数量

java常用工具集合

≡放荡痞女 提交于 2019-12-05 03:49:00
1、集合和数组的区别: ①集合中只能存储引用型数据,如果存储基本类型会自动装箱;数组既可以存储基本类型也可以存储引用类型的数据。 ②集合长度不固定,可任意扩充;数组长度固定。 2、Java的集合体系: (1)单列集合 :(顶层是Collection接口) ①List集合 (list是接口,要想使用里面的方法必须创建子类对象) :最常用的子类是ArrayList List集合中元素可重复,有序。通过创建子类对象使用:List list=new ArrayList(); eg:向List集合中添加三个元素并遍历打印 分析:向集合中添加元素的方法:add()、遍历集合的方式:for()、获取集合中元素个数的方法:size() package com.wang.list; import java.util.ArrayList; import java.util.List; /*List是接口,要创建子类对象 使用集合的步骤:创建集合对象-》创建元素对象-》将元素对象添加到集合对象中-》遍历集合 */ public class ListDemo01 { public static void main(String[] args) { //往List集合中添加3个学生对象,然后遍历 //创建集合对象 List list=new ArrayList(); //创建元素对象 Student s1

实现简单的双向链表

落爺英雄遲暮 提交于 2019-12-05 03:14:29
package com.zhangwl.数据结构.双向链表;/** * @ClassName Node * @Description 双向链表节点 * @Author zhangwl * @Date 2019/11/18 22:34 * @Version 1.0 **/@SuppressWarnings("all")public class Node { //节点id编号 public Integer id; //节点数据 public String data; //节点指针指向下一个节点 public Node next; //节点指针指向上一个节点 public Node pre; public Node() { } public Node(Integer id, String data) { this.id = id; this.data = data; } /** * 打印具体节点信息 * * @return */ @Override public String toString() { //这块容易导致java.lang.StackOverflowError 异常,在打印next和pre的情况下会导致该异常(无线循环) return "Node{" + "id=" + id + ", data='" + data + "'}"; }} package com