数据结构-线性表与链性表(二)

news2024/11/16 3:39:04

目录

一、学习背景

二、简绍

三、线性表

一、什么是线性表

二、操作

1、插入

2、删除

3、查询

三、数组应用案例中源码分析

1、插入

2、删除

3、get与set

4、扩容

二、单向链表

单向链表结构

循环链表

三、数组和链表比较

1、时间复杂度角度

2、其他维度

3、灵活性/大小

重点总结

四、双向链表

1、插入

2、删除

3、查询

五、总结数据结构应用场景

数组

集合

List

Set

Map

分类总结

时间复杂度

  List

  Set

  Map

总结


一、学习背景

通过我们面试,算法学习,以及开发出高性能代码。

二、简绍

数据结构是计算机中存储和组织数据的一种特定方式, 常用的数据结构有数组, 字符串, 链表, 栈, 队列, 树和图等。

根据元素的组织方式, 可以分为两种, 线性结构 非线性结构。

三、线性表

一、什么是线性表

线性表就是数据排成一条线一样的结构。

比如:

数组、栈、队列、链表等等

那么有线性,就有非线性,比如:

树(二叉树)、图、堆等等

那么他们的时间复杂度到底是多少呢?

二、操作

以数组为例:int[] arr=new int[10];

数组常规操作有:插入、删除、查询

那么这些操作你会怎么做?比如:

1、插入

假入我们插入一个数,从下面接种场景去看

他们的时间复杂度是什么样的呢?

1、插入第一个位置

我们如果在第一个位置进行插入,这样每次都要把当前往后移动,有多少个元素移多少次,

如图:

这样他的平均移动次数就是:

2、插入中间

我们发现插入中间和第一个位置,效果都差不多,都需要移动后面的元素,所以移动的平均值还是O(n),所以时间复杂度是O(n)。

3、插入末尾

我们指插入末尾,所以他的时间复杂度是O(1)。

2、删除

时间复杂度是什么样的?

1、删除第一个元素

这个跟插入的原理是不是一样,我每次删除第一个,元素都要往前移动一位。所以他的时间复杂度是一样的,都是O(n).

2、删除中间的元素

与插入原理一样O(n)

3、删除最后一个元素

与插入原理一样O(1)

3、查询

时间复杂度是什么样的?

查询有两种:一种根据下标查,一种根据数据查

1、根据下标查

我们直接去数组下标的某个指针下的值,他的时间复杂度是不是就是O(1).

2、根据数据查

比如我们要去找一个等于6的数。我们最好的情况就是第一次就找到了,但最坏的就是遍历一个一个查找。

所以平均来看他的算法跟上面是一样的,都是O(n)。

知识点:数组为什么是从0开始?

1、0编号的写法他可以节省编译的时间

2、Python的作者,他认为在现在语言中,0可以更优雅的表示数组字符串,

3、在支持指针的语言中,标示为偏移量,更符合逻辑

三、数组应用案例中源码分析

比如ArrayList

可以看他的插入,删除。查询对应实现,可验证时间复杂度。

1、插入

首先是扩容。后面可以看到indx都是偏移一位,每一次都是复制当前为后一个位置的值。

public void add(int index, E element) {
    rangeCheckForAdd(index);


    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

显然,插入一个元素,牵连后面所有元素,这样效率就低了。

2、删除

同样可以看到他把inde元素向前移动一位。

private void fastRemove(int index) {
    modCount++;
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work
}

3、get与set

//get
public E get(int index) {
    rangeCheck(index);


    return elementData(index);
}
//set
public E set(int index, E element) {
    rangeCheck(index);


    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

都是根据索引进行操作的,所以他的时间复杂度是O(1).

由此可见数组的时间复杂度,就是看他有没有循环,循环几次。没有循环就是O(1)

4、扩容

我们知道所谓的扩容就是创建一个长度更大的数组。旧的的数组的元素全部复制到新的数组里面。所以显然他的效率也是比较低的。

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};


public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

我们可以看到,我们不指定大小他会指定一个空的数组,然后在初始化为一个默认为10大小的数组。

可能我们并不需要这个大的数组,可能就是3,所以我们为何不一开始就指定他的容量呢。这样容量就省了。

所以我们一般要对ArraryList进行指定大小,这样我们就避免他扩容,以及可以只使用指定大小的容量而不浪费资源。

所以对应ArrayList初始化需要注意:

1、能不使用就不要使用默认构造函数

2、当你知道你的类表容量的时候,最好用指定的容量来创建实例。

3、如果不知道容量,预估一下,指定稍大与预估值的容量

默认容量为10.

目的:能够保证我们写出更好性能的代码。(附带面试)

二、单向链表

一、定义:

链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

首先我们知道数据声明,他是需要一块连续的内存空间的,而链表他不需要一块连续的内存空间,它是由零散的内存创建起来的。

所以链表他是通过指针把零散的内存串联在一起,其中每一块内存就叫做链表的节点。

单向链表结构

所以从单向链表来看,每一个节点是有这些内容组成的,

有这个链表可看,它是由一个头结点和尾结点的,有了头结点我们就可以去遍历,我们可以不断的next遍历,就能找到。

而尾结点的下个节点,他其实指向的是一个null。所以当我们查询下个指向为null,则说明没有节点了。

同样我们的链表也支持,插入,删除,和查询

1、插入

我们插入是不是把上个节点指针是向需要插入的节点,插入的指向上个指针的指向节点

那么他的时间复杂度是不是O(1)。看上去是不是很美好,但是呢,有利就有弊。我们想一下,数组的随机访问,是不是可以指定下标,访问指定的元素。而链表可以吗?

我们即使是说,我们要第三个元素,或者第四个元素,我们是不是都要从链表的头进行取遍历。

一个个的遍历知道我们想找到的节点。

所以还是之前的逻辑 他的时间复杂度是不是就是O(n)了。

总结:插入是O(1),查询O(N).但是插入伴随着查询。

循环链表

他是一种特殊的单链表,特殊之处就是他的尾结点不在指向为一个null了。而是指向了头结点。

他的优点就是尾到头比较方便。

比较著名的场景就是约瑟夫环, 就是指定环中某个节点,每次遍历到他就把他从队列中剔除的一个场景。比如:排除数据,时间轮等等

三、数组和链表比较

那么什么时候使用哪一种比较好呢?

答案就是看使用场景。

1、时间复杂度角度

插入:数组O(n)、链表O(1)

随机访问:数组O(1)、链表O(n)

由此可分析出以他们为基础实现的存储结构的性能,以及使用场景。

2、其他维度

时间复杂度只是一个维度,实际中还需要看其他方面

可以看他的易用,内存连续性。

比如数组他的内存就是连续的。所以可以借助cpu的缓存机制,来预读数据,来提高数据的访问效率,所以访问速度比较快。所以他们的缺点既是优点。

3、灵活性/大小

还有就是数组的内存是固定的,你申请多少就是多少,当不够用了,你是不是要在创建一个更大的数组,然后把数据复制过去,这样是不是很耗费时间。

而链表他是没有大小限制的,他是可以动态的扩容的。就是我指针动态往后加呗,所哟他是非常灵活的。

重点总结

链表使用小建议:

  1. 时刻要记住next指向的位置,指针你弄丢了他的指向,就不知道下一个是谁。
  2. 有必要的取设置一个:哨兵节点,也叫dummy节点。什么场景呢?就是我们在做删除操作的时候,你能保证删除的不是这个头节点吗?如果是这个头你怎么保证返回下一个头。所以你加一个哨兵节点,你也就能保证他的一个头。
  3. 写完最好进行test,对场景测试,是不是没问题。
  4. 画图,进行理解
  5. 多练习

四、双向链表

定义:

双向链表:是在单链表的每一个节点中,在设置一个指向其前驱节点的指针。

由图看,他是不是比单向链多占用一个空间。多了一个pre节点。

既然这样,她有什好处呢?

从结构上看,我们是不是可以通过O(1)的时间操作节点来找到他的前驱节点?显然不可以,

首先,还是从操作来分析:

1、插入

  1. 插入指定节点前驱节点,我们是不是也要遍历一遍进行查找,然后找该节点,前驱进行插入,是不是也是O(1)。
  2. 单向插入是不是要遍历查找该节点前驱,而双向则不需要遍历。直接找到了。所以时间复杂度还是O(n)和O(1)的关系。

2、删除

  1. 删除某个给定的值,这个跟单向是没有区别的,不管怎么样,你都要从头遍历吧。然后在删除,所以尽管链表他的删除节点是O(1).但他掺杂了查找的操作,所以是O(n)。
  2. 单向链表他要删除某一个节点的时候,是不是要找到他的前驱,因为是单向,要找到他的前驱是不是只能遍历取找。直到找到这个前驱是不是。而双向链表则不然,可以直接获取前驱结点

3、查询

  1. 同样,查询的时候,同样是双向链表效率高一点。你可以记录上次查找的位置。每次要查询的时候,可以根据要找的值跟当前的值作比较,然后决定向前还是向后。所以就是虽然双向比较耗内存,但是还是比较受欢迎的地方。

就像java中LinkHashMap容器,他就是双向链表的结构。所以这个就是空间换时间概念

所以针对执行较慢的程序,可以通过消耗更多的内存来优化,就是所谓的空间换时间,反之亦然。

五、总结数据结构应用场景

数组

与集合简单区别

  • 数组固定
  • 集合可变

集合

(网络图片)

List

List 有序,可重复

  • ArrayList
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程不安全,效率高

应用场景:是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。

  • Vector矢量队列

结构跟arrayList差不多,因效率慢,被arrayList替代
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低

应用场景:是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。(过时)

  • LinkedList
    优点: 底层数据结构是链表,查询慢,增删快。
    缺点: 线程不安全,效率高

应用场景:是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作,随机访问效率低,但随机插入、随机删除效率低。

Set

无序,唯一

  • HashSet
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    1.依赖两个方法:hashCode()和equals()
  • LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯
  • TreeSet
    底层数据结构是红黑树。(唯一,有序)
    1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

应用场景:

这个如何根据场景去选择使用哪一种集合是让人头疼的问题. 简而言之,如何你需要的是一个快速的集合,建议你使用HashSet如果你需要的是一个排序集合,请选择TreeSet,如果你需要一套能够存储插入顺序的集合,请使用LinkedHashSet。

性能对比:

Map

  • Hashtable 

接口实现类, 同步, 线程安全 是有序的

应用场景: hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronized关键字。但是现在已经不再推荐使用HashTable了,因为现在有了ConcurrentHashMap这个专门用于多线程场景下的map实现类,其大大优化了多线程下的性能。

  • HashMap 

接口实现类 ,没有同步, 线程不安全- 是无序的

 -----LinkedHashMap 双向链表和哈希表实现

应用场景:可以保存kv形式的数据,key不可重复且无序,但是查找的效率很高

  • TreeMap 

红黑树对所有的key进行排序 是无序的(严格意义:TreeMap所谓的有序并不是按照数字顺序,而是字典顺序。数量key排序后看似有序,字符串排序后,就看似无序

应用场景:TreeMap 实现了 SortMap 接口,其能够根据键排序,默认是按键的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时得到的记录是排过序的,所以在插入和删除操作上会有些性能损耗,TreeMap 的键不能为空,其为非并发安全 Map,此外 TreeMap 基于红黑树实现

注意:Vector与Hashtable是旧的,是java一诞生就提供了的。

分类总结

Collection 接口的接口 对象的集合(单列集合)

├——-List 接口:元素按进入先后有序保存,可重复

│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全

│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全

│—————-└ Vector 接口实现类 数组, 同步, 线程安全

│ ———————-└ Stack 是Vector类的实现类

└——-Set 接口: 仅接收一次,不可重复,并做内部排序

├—————-└HashSet 使用hash表(数组)存储元素

│————————└ LinkedHashSet 链表维护元素的插入次序

└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)

├———Hashtable 接口实现类, 同步, 线程安全

├———HashMap 接口实现类 ,没有同步, 线程不安全-

│—————–├ LinkedHashMap 双向链表和哈希表实现

│—————–└ WeakHashMap

├ ——–TreeMap 红黑树对所有的key进行排序

└———IdentifyHashMap

时间复杂度

  List

ArrayList

ArrayList 是线性表(数组)

get() 直接读取第几个下标,复杂度 O(1)

add(E) 添加元素,直接在后面添加,复杂度O(1)

add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)

remove()删除元素,后面的元素需要逐个移动,复杂度O(n)

LinkedList

LinkedList 是链表的操作

get() 获取第几个元素,依次遍历,复杂度O(n)

add(E) 添加到末尾,复杂度O(1)

add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)

remove()删除元素,直接指针指向操作,复杂度O(1)

Vector矢量队列

结构与ArraryList差不多

随机访问:O(1)

插入 :  O(n)

  Set

Hashtable 

hashSet,hashtable,hashMap 都是基于散列函数, 时间复杂度 O(1) 但是如果太差的话是O(n)

HashSet

HashSet是基于散列表实现的,元素没有顺序;add、remove、contains方法的时间复杂度为O(1)。(contains为false时,就直接往集合里存)

总结:查 0(1) 增 0(1) 删0(1)

add() 复杂度为 O(1)

remove() 复杂度为 O(1)

contains() 复杂度为 O(1)

TreeSet(基于红黑树)

TreeSet是基于树实现的(红黑树),元素是有序的;add、remove、contains方法的时间复杂度为O(log (n))(contains为false时,插入前需要重新排序)。

总结:查 0(log n) 增 0(log n) 删0(log n)

add() 复杂度为 O(log (n))

remove() 复杂度为 O(log (n))

contains() 复杂度为 O(log (n))

  Map

TreeMap(基于红黑树)

平均时间复杂度 O(log n)

TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。

HashMap

正常时间复杂度 O(1)~O(n)

红黑树后 O(log n)

HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。正常是0(1)到0(n) jdk1.8添加了 红黑树 是 0(log n)

TreeMap的get操作的时间复杂度是O(log(n))的,相比于HashMap的O(1)还是差不少的。

LinkedHashMap

能以时间复杂度 O(1) 查找元素,又能够保证key的有序性

LinkedHashMap的出现就是为了平衡这些因素,能以O(1)时间复杂度查找元素,又能够保证key的有序性

总结

结构

Array (T[])

  • 当元素的数量是固定的,并且需要使用下标时。

Linked list (LinkedList<T>)

  • 当元素需要能够在列表的两端添加时。否则使用 List<T>。

Resizable array list (List<T>)

  • 当元素的数量不是固定的,并且需要使用下标时。

Stack (Stack<T>)

  • 当需要实现 LIFO(Last In First Out)时。

Queue (Queue<T>)

  • 当需要实现 FIFO(First In First Out)时。

Hash table (Dictionary<K,T>)

  • 当需要使用键值对(Key-Value)来快速添加和查找,并且元素没有特定的顺序时。

Tree-based dictionary (SortedDictionary<K,T>)

  • 当需要使用价值对(Key-Value)来快速添加和查找,并且元素根据 Key 来排序时。

Hash table based set (HashSet<T>)

  • 当需要保存一组唯一的值,并且元素没有特定顺序时。

Tree based set (SortedSet<T>)

  • 当需要保存一组唯一的值,并且元素需要排序时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JS】原生js实现矩形框的绘制/拖动/缩放

1、要点及功能描述 通过js监听mouse事件来实现矩形框的绘制&#xff0c;再通过区分点击的是边角还是其他位置来实现矩形框的缩放和拖动&#xff0c;并且在拖动和缩放时&#xff0c;都做了边界限制&#xff0c;当缩放或拖动 到边界时&#xff0c;就不能继续拉缩放拖动了。当然在…

【个人简介】一枚在上海的AndroidiOSWindow逆向电子工程师

> Hello World!, I am Humenger 「 From Shanghai, China 」 「 Android Reverse engineer, applied electronic technology Shan Dong University, China 」 &#x1f41d;主要涉及平台: Android(70%),iOS(15%),Window(5%),macOS(3%),其他(7%) &#x1f98b;主要涉…

易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)

N7-甲基鸟苷&#xff08;N7-methylguanosine&#xff0c;m7G&#xff09;是真核生物tRNA、rRNA和mRNA 5cap中最丰富的修饰之一。作为一种重要的表观遗传修饰&#xff0c;m7G RNA甲基化在基因表达、加工代谢、蛋白质合成、转录稳定等方面发挥着重要的作用&#xff0c;参与疾病发…

Pinely Round 1 (Div. 1 + Div. 2) E - Make It Connected思维分类讨论

昨晚的problem e 一直wa。因为答案&#xff0c;不唯一&#xff0c;调起来只能肉眼debug。被干emo了qwq。好在赛后看到 ugly2333的 思路和我差不多&#xff0c;最后还是要选取度数较小的最优, 好像从度数的角度出发&#xff0c;不容易wa。 题意&#xff1a; 给你一个图&#xf…

什么是组织孤岛?它会带来哪些影响?可以这样去对付它

作为一个在不同地点和时区与不同团队合作的远程工作者&#xff0c;我有过公平的孤岛经历。 是的&#xff0c;它们扼杀了任何组织的成长。那么&#xff0c;在使你&#xff08;和组织中的每个人&#xff09;失去生产力、困惑、自私和不快乐之后。 在这篇文章中&#xff0c;我将…

ADRV9009中armBinary反汇编IDA参数设置

armBinary.bin文件如果不做处理的话就是一堆16进制数,扔到IDA里也只是一堆有颜色的16进制数,需要进行一些参数设置。 1 选择IDA32位打开armBinary.bin文件 2 load a new file设置 Processor type选择ARM Little-endian [ARM],点击Edit ARM architecture options进行相应修…

Linux 中的内部命令和外部命令

Linux 中的内部命令和外部命令 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Linux 中的内部命令和外部命令 CSDN&#xff1a;Linux 中的内部命令和外部命令 什么是 bash shell ? bash shell&#xff0c;就是一个程序&#xff0c;就是 Linux 系统安装的…

漫谈 Java 平台上的反应式编程

反应式编程&#xff08;Reactive Programming&#xff09;是一套完整的编程体系&#xff0c;既有其指导思想&#xff0c;又有相应的框架和库的支持&#xff0c;并且在生产环境中有大量实际的应用。在支持度方面&#xff0c;既有大公司参与实践&#xff0c;也有强大的开源社区的…

【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍

目录 一、yum 1.了解yum &#xff08;1&#xff09;RPM &#xff08;2&#xff09;yum 2.yum使用 &#xff08;1&#xff09;查看软件包 &#xff08;2&#xff09;安装软件 &#xff08;3&#xff09;卸载软件 二.Linux编辑器-vim 1. vim概念 &#xff08;1&am…

flink集群搭建

1、安装包flink-1.10.0-bin-scala_2.11.tgz 2、tar -zxf flink-1.10.0-bin-scala_2.11.tgz 解压到指定目录 解压之后的文件名称是flink-1.10.0 3、flink-1.10.0的目录结构如下&#xff1a; bin/&#xff1a;flink的相关命令 conf/&#xff1a;flink的配置文件 examples/&a…

业务数据分析-Excel公式与函数(三)

目录 概念 运算符 地址的引用 逻辑函数 文本函数 统计函数 查找与引用函数 日期函数 常见出错信息 概念 公式&#xff1a;Excel的核心功能&#xff0c;功能强大 如果要定义的话&#xff0c;可以说是 以开头的&#xff0c;对地址进行引用的计算形式 说的高大上一点的…

方法2—并行数据流转换为一种特殊串行数据流模块的设计

并行数据流转换为一种特殊串行数据流模块的设计&#xff0c;设计两个可综合的电路模块1&#xff0c;第一个可综合模块&#xff0c;M1。2&#xff0c;描述M2模块3&#xff0c;描述M0模块的Verilog代码4&#xff0c;描述顶层模块5&#xff0c;电路生成的门级网表&#xff0c;netl…

Camtasia2023简单易用的电脑录屏视频剪辑软件

教学、演示、培训视频轻松制作!Camtasia非常容易学习 你不需要一个大的预算或花哨的视频编辑技能。只需录制屏幕并添加一些特效即可。无论您是有经验还是这是第一次制作视频 Camtasia都会为您提供制作高质量视频所需的一切。创建观看者实际观看的内容。视频将为您提供更多的互动…

军队文职丨2022年武警部队面向社会公开招聘351名文职人员公告!高中学历可报,11月25日前报名!

2022年武警部队面向社会公开招聘 专业技能岗位文职人员公告 根据《军队专业技能岗位文职人员聘用管理暂行规定》及有关政策规定&#xff0c;现就2022年武警部队面向社会公开招聘专业技能岗位文职人员有关事项公告如下&#xff1a; 一、招聘岗位 武警部队所属用人单位运输投送…

前后端分类 (增加,查询)

目录 一&#xff0c;后台代码 二&#xff0c;前台代码 一&#xff0c;后台代码 一&#xff0c;配置文件 application.yml server:port: 8080servlet:context-path: /spboot spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.j…

隧道HTTP API使用教程

华科隧道HTTP格式为&#xff1a;ip:port username password 隧道代理分钟2种模式&#xff1a; 固定时间更改新IP&#xff08;比如5分钟&#xff0c;10分钟&#xff0c;初次开通的时候可设定&#xff09;请求一次更换一个新IP&#xff08;可通过浏览器或者curl&#xff09; 1、…

图_图的存储_添加边_图的遍历_DFS_树的重心_BFS_图中点的层次

文章目录图有向图的存储添加遍历1.DFS例题&#xff1a;树的重心题目分析使用DFS遍历2.BFS例题&#xff1a;图中点的层次图 树是特殊的图&#xff08;无环连通图&#xff09; 有向图&#xff08;a -> b&#xff09; 无向图&#xff08;a -> b, b -> a&#xff09; …

ffmpeg源码阅读之avformat_alloc_output_context2

整体结构流程 核心逻辑 通过读源码发现核心的处理逻辑是av_guess_format函数&#xff0c;这里就根据核心逻辑来阅读&#xff0c;其余的基本是是在做判断和赋值 av_guess_format阅读分析 步骤1(先看头文件) /*** Return the output format in the list of registered output…

wy的leetcode刷题记录_Day46

wy的leetcode刷题记录_Day46 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-11-19 前言 补 目录wy的leetcode刷题记录_Day46声明前言1732. 找到最高海拔题目介绍思路代码收获106. 从中序与后序遍历序列构造二叉树题目介绍思路代码…

【Java毕设】基于SpringBoot实现新冠疫情统计系统(Idea+Navicat)

推荐学习专栏&#xff1a; Java基础学习专栏&#xff1a;java基础知识学习Java进阶学习专栏&#xff1a;java编程进阶学习 前言 疫情在我们的生活中反反复复&#xff0c;为了方便我们更直观的清楚新冠疫情数据&#xff0c;通过Java编程可以统计疫情信息&#xff0c;更好管控。…