自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 14.3 马踏棋盘

骑士周游问题的解决步骤和思路1.创建棋盘chessBoard,是一个二维数组2.将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList),最多有8个位置,每走一步,就使用step+13.遍历ArrayList中存放的所有位置,看看哪个可以走通,如果走通,就继续,走不通,就回溯.4.判断马儿是否完成了任务,使用step和应该走的步数比较,如果没有达到数量,则表示没有完成任务,将整个棋盘置0.注意:马儿不同的走法(策略),会得到不同的结果,效率也会有影

2020-09-16 17:14:28 69

原创 14.2 kmp

字符串匹配(暴力匹配法)public static int ViolenceMatch(String str1, String str2){ char[] s1 = str1.toCharArray(); char[] s2 = str2.toCharArray(); int s1Len = str1.length(); int s2Len = str2.length(); int i = 0; int j

2020-09-10 23:31:56 91

原创 14.1 动态规划

动态规划算法应用场景-背包问题1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2) 要求装入的物品不能重复代码如下:package dynamic;public class KnapsackProblem { public static void main(String[] args) { int[] w = {1, 4, 3}; //物品重量 int[] val = {1500, 3000, 2000}; //物品的价值 这里val[

2020-09-09 23:37:13 86

原创 13.1 汉诺塔

分治算法分治算法介绍:1)分治法是一种很重要的算法。字面上的解释是分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…2)分治算法可以求解的一些经典问题二分搜索,大整数乘法,棋盘覆盖,合并排序,快速排序,线性时间选择,最接近点对问题,循环赛日程表,汉诺塔。分治算法的基本步骤:分治法在每一层递归上都

2020-09-09 23:25:33 66

原创 12.2 图(深度优先算法,广度优先算法)

图的深度优先遍历介绍图遍历介绍所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历基本思想1)深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点,可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。2)我们可以看到,这样的访问策略是优先往纵向挖掘深入,而

2020-09-08 17:01:24 174

原创 12.1 图

图基本介绍为什么要有图:1)前面我们学了线性表和树2)线性表局限于一个直接前驱和一个直接后继的关系3)树也只能有一个直接前驱也就是父节点4)当我们需要表示多对多的关系时,这里我们就用到了图图的举例说明:图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。如图:图的常用概念1)顶点(vertex)2)边(edge)3)路径4)无向图ps:【源码自取,点击即可】ps:以上笔记均来自尚硅谷韩顺平老师《Java数据结构与java算法

2020-09-07 23:11:57 74

原创 11.2 B树

二叉树与B树二叉树的问题分析二叉树的操作效率较高,但是也存在问题,请看下面的二叉树1)二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿),就存在如下问题2)问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响3)间题2:节点海量,也会造成二叉树的高度很大,会降低操作速度..二叉树与B树多叉树1)在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节

2020-09-07 23:06:49 51

原创 11.1 AVL(平衡二叉树)

平衡二叉树(AVL树)基本介绍:1.平衡二叉树也叫平衡二叉树搜索树又被称为AVL树,可以保证查询效率较高。2.具有一下特点:它是一棵空树或它的左右两个子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,平衡为叉树的常用实现方法有红黑树,AVL,替罪羊树,Treap,伸展树等。求树的高度//返回左子树高度 public int leftHeight(){ if (this.left == null){ return 0; }

2020-09-07 09:44:56 152

原创 11.0 二叉排序树

二叉排序树二叉排序树:BST: (Binary Sort(Search)Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点.比如针对前面的数据(7,3,10,12,5,1,9),对应的二叉排序树为:构建二叉排序代码如下递归添加节点 //递归添加节点 public void add(Node node){ if (node == null){

2020-09-03 10:25:10 75

原创 10.2 赫夫曼编码

赫夫曼编码1)赫夫曼编码也翻译为_哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于一种程序算法2)赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。3)赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间4)赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码实例分析1)i like like like java do you like a java2) d:1 y:1 u:1 j:2 v:2 o:2

2020-08-31 23:44:34 241

原创 10.1 赫夫曼树

赫夫曼树1)给定n个权值作为n个吐子结点,构造一棵二 叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree),还有的书翻译为霍夫曼树。2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。赫夫曼树几个重要概念和举例说明3) 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树。4) WPL最 小的就是赫夫曼树

2020-08-20 22:24:26 145

原创 9.5 排序 (堆排序)

堆排序1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为0(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆4)大顶堆举例说明堆排序基本思想1)将待排序序列构造成一一个大顶堆2)此时,整个序列的最大值就是堆顶的根节点。3) 将其与末尾元素进行交

2020-08-18 17:44:55 153

原创 9.4 二叉树(线索二叉树)

引入问题:将数列{1,3,6,8, 10,14 }构建成一颗二叉树.问题分析:1)当我们对 上面的二叉树进行中序遍历时,数列为{83,10,1 6.14}2) 但是6, 8, 10, 14这几个节点的左右指针,并没有完全的利用上3)如果我们希望充分的利用 各个节点的左右指针,让各个节点可以指向自己的前后节点怎么办?4)解诀方案线索二叉树线索二叉树基本介绍:n个结点的二叉链表中含有n+1 [ 公式2n-(n-1)=n+1]个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的

2020-08-16 10:52:18 97

原创 9.3 二叉树(顺序存储二叉树)

顺序存储二叉树基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换即数组可以转换成树,树也可以转换成数组(实际用于堆排序)顺序存储二叉树的特点(1)顺序二叉树通常只考虑完全二叉树(2)第 n个元素的左子节点为2n+1(3)第 n个元素的右子节点为2n+2(4)第n个元素的父节点为(n-1)/2(5)n:表示二叉树中的第几个元素(按0开始编号如图所示)代码实现:(前,中,后序遍历)class ArrBinaryTree{ private int[] arr; /

2020-08-14 21:31:48 117

原创 9.2 二叉树(删除节点)

二叉树-删除节点:1)如果删除的节点是叶子节点,则删除该节点2)如果删除的节点是非叶子节点,则删除该子树.3)测试,删除掉5号叶子节点和3号子树.完成删除结点的操作:1)如果删除的节点是叶子节点,则删除该节点2)如果删除的节点是非叶子节点,则删除该子树思路:首先先处理:考虑如果树是空树root,如果只有一个root结点,则等价将二叉树置空然后进行下面步骤1.因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点.2.如果当

2020-08-14 21:26:21 130

原创 9.1 二叉树(前中后遍历,查找)

为什么需要树这种数据结构:1)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)3)树存储方式的分析能提高数据存储,读取的效率,比如利用二叉排序树(Binary

2020-08-14 13:40:37 93

原创 8.0 哈希表

哈希表的基本介绍:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个中映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的实例运用:google公司的一个上机题:有一个公司,当有新的员工来报道时要求将该员工的信息加入(id,性别年龄,名字,住址…),当输入该员工的id时,要求查找到该员工所有信息.要求:不使用数据库,速度越快越好=>哈希表(散列)添加时,

2020-08-10 23:16:55 430

原创 7.0 查找

线性查找:按着数组一个接着一个查找代码如下:public static List<Integer> seqSearch(int[] arr, int value){ List<Integer> res = new ArrayList<>(); for (int i = 0; i < arr.length; i++){ if (value == arr[i]){ res.add(i); }

2020-08-09 11:08:36 98

原创 6.8 排序 (基数排序)

基数排序(桶排序)介绍:1.基数排序属于分配式排序,又称桶子法,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用2.基数排序法属于稳定性的排序,基数排序法的是效率高的稳定性排序法3.基数排序是桶排序的扩展4.基数排序是1887年赫尔曼.何乐礼发明的,它是这样实现的:将整数按位数切割成不同的数字,然后按每个位分别比较。基数排序思想图解:代码如下:public static void radSort(int[] arr){ //根据前面推导过程得到最大数的位数

2020-08-06 15:58:55 129

原创 6.7 排序 (归并排序)

归并排序:归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略分治算法将问题分成一些小的问题然后递归求解,而治的阶段将分的阶段得到的个答案“修补”在一起,即分而治之归并代码如下://合并的方法/**@param arr 排序的原始数组*@param left 左边有序序列的初始索引*@param mid 中间索引*@param right 右边有序序列的初始索引*@param temp 作为中转的数组* */public static void merge(int[]

2020-08-05 23:25:25 158

原创 6.6 排序 (快速排序)

快速排序:快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序代码如下:public static void quickSort(int[] arr, int left, int right){ int l = left; //左下标 int r = right; //右下标 in

2020-08-05 23:18:31 193

原创 6.5 排序 (希尔排序)

希尔排序:希尔排序也是一种插入排序,他是简单插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序希尔排序基本思想:希尔排序是吧记录按下标的一定增量分组,对每组使用直接插入排序算法排序随着增量逐渐减少,每组包含的关键词越来越多,当增量减到1时,整个文件恰分成一个组算法便终止希尔排序示意图:希尔排序代码实现(交换法):public static void shellSort(int[] arr){ int temp = 0, count = 0; for (int gap

2020-08-03 21:41:09 159

原创 6.4 排序 (插入排序)

插入排序插入式排序属于内部排序法,是对于欲排序的元素已插入的方式找寻该元素的适当位置,以达到排序的目的插入排序法思想:插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。代码如下://插入排序public static void insertSor

2020-07-29 09:25:11 83

原创 6.3 排序 (选择排序)

选择排序选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一个元素,再依规定交换位置后达到排序的目的。选择排序思想:选择排序(select sorting) 也是一种简单的排序方法。它的基本思想是:第一次从arr[0]^ arr[n- -1]中选取最小值,与arr[0]交换, 第二次从arr[1]^ arr[n-1]中选取最小值,与arr[1]交换, 第三次从arr[2]^ arr[n-1]中与arr[i-1]交换,.,.第n-1次从arr[n-2]^ arr[n-1]中选取最小值,

2020-07-25 23:14:57 70

原创 6.2 排序 (冒泡排序)

冒泡排序基本介绍冒泡排序(Bubble Sorting) 的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)图解冒泡排序:冒泡排序代码如下://冒泡排序,排

2020-07-25 10:00:50 448

原创 6.1 排序 (排序基础概念)

排序算法的介绍:排序也称排序算法排序是将一组数据,依指定的顺序进行排序的过程排序分类(1)内部排序指将需要处理的所有数据都加载到内部存储器中进行排序(2)外部排序数据量过大,无法全部加载到内存中,需要借助外部存储进行排序(3)常见的排序算法分类(如下图)时间频度:占时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(y)。 [举例说明]算法时间复杂度算法时间复杂度1)一般

2020-07-25 09:47:59 162

原创 5.2 递归 (8皇后问题)

八皇后问题实例八皇后思路分析:1)第一个皇后先放第一-行第一列2)第二个皇后放在第二行第一列、然后判断是否0K,如果不0K, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适3) 继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解4) 当得到一个正确解时,在栈回退到上-一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.5)然后回头继续第-一个皇后放第二列,后面继续循环执行1,2,3,4的步骤说明:理论上应该创建-一个

2020-07-23 22:41:56 76

原创 5.1 递归 (基础概念,实例分析)

递归概念:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用规则:1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2.方法的局部变量是独立的,不会相互影响3.递归必须向退出递归条件逼近,否则无限递归,死龟了4.当一个方法执行完毕,或者遇到return,就返回,遵守谁调用,就将结果返回给谁,同时当方法执行或者返回时,该方法也就执行完毕5.如果方法中使用的是引用类型变量(如数组),就会共享该引用类型的数据递归程序分析

2020-07-22 20:51:48 93

原创 4.4 栈 (中缀表达式转后缀表达式)

中缀表达式转后缀表达式的思路步骤分析:1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;2)从左至右扫描中缀表达式;3)遇到操作数时,将其压s2;4)遇到运算符时,比较其与s1栈顶运算符的优先级:1.如果s1为空,或栈顶运算符为左括号“(",则直接将此运算符入栈;2.否则,若优先级比栈顶运算符的高,也将运算符压入s1;3.否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;5)遇到括号时:(1)如果是左括号“(”,则直接压入s1(2)如果是右括

2020-07-21 09:06:26 80

原创 4.3 栈(逆波兰式计算器分析)

前缀表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈项元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。例如: (3+4)X5-6对应的前缀表达式就是- X +3456,针对前缀表达式求值步骤如下:思路:...

2020-07-20 20:03:09 99

原创 4.2 栈 (栈模拟一个综合计算器,中缀表达式)

引入实例:计算:7-2*3-1思路图解如下:代码如下所示://定义一个栈和需要扩展相应的功能class ArrayStack2{ private int maxSize;//栈的大小 private int[] stack;//数组模拟栈 private int top = -1;//top表示栈顶,初始化为-1 //构造器 public ArrayStack2(int maxSize){ this.maxSize = maxSize;

2020-07-17 23:28:53 76

原创 4.1 栈 (栈的概念,数组模拟栈)

栈1.他是一个先入后出的有序的列表2.栈是限制线性表中元素的插入和删除只能在线性表的同一段进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底3.根据定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除(先入后出)栈的运用场景1)子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。2)处理递归调用: 和子程序的调用类似,只

2020-07-16 23:44:31 81

原创 3.6 链表(环形链表,约瑟夫问题)

单向环形链表应用场景单向环形链表示意图:约瑟夫问题:编号1,2,3,4,5…的n个人围坐在一圈,约定编号为k(1<=K<=n)的人从1开始报数,数到那个人出列,它的下一位又从1开始报数,数到m那个人出列,以此类推,知道所有人出列为止,由此产生一个出队序列。(需要借用环形链表解决此类问题)例如:5个孩子,第一个人开始报数,报数为2的出列,然后出队列顺序如下所示:算法分析如下:代码如下://创建一个Boy类,表示一个节点、class Boy{ private int no

2020-07-15 09:18:11 83

原创 3.5 链表(双链表)

双向链表单向链表的缺点分析:1.单向链表:查找方向只能是一个方向,而双向链表可以向前或者向后查找2.单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点双向链表的遍历:1.遍历方式和单链表一样,只是可以向前,也可以向后查找//显示链表[遍历]public void list(){ //判断是否为空 if (head.next == null){ System.out.p

2020-07-14 09:35:45 91

原创 3.4 链表 (单链表实战演练)

获取单链表节点个数代码如下://方法:获取单链表节点个数(如果带头节点,不需要统计头节点)public static int getLength(HeroNode head){ if (head.next == null){ return 0; } int length = 0; HeroNode cur = head; while (cur.next != null){ length++; cur = cur.n

2020-07-13 21:54:38 64

原创 3.3 链表 (单链表修改,删除)

修改节点1.先找到该节点,通过遍历2.temp.name = newHeroNode.name; temp.nickname = newHeroNode.nickname;代码如下://修改节点的信息,根据no编号来修改,即no编号不能改public void update(HeroNode newHeroNode){ if (head.next == null){ System.out.println("链表为空!!"); } boolean flag

2020-07-11 22:49:07 580

原创 3.2 链表 (单链表编号顺序添加)

需要按照编号的顺序添加1.首先找到新添加的节点位置,是通过辅助变量(指针),通过遍历来实现2.新的节点.next = temp.next3.将temp.next = 新的节点代码如下://修改节点的信息,根据no编号来修改,即no编号不能改public void update(HeroNode newHeroNode){ if (head.next == null){ System.out.println("链表为空!!"); } boolean flag

2020-07-11 22:09:47 266

原创 3.1链表(单链表插入顺序添加)

3.1链表(单链表)链表介绍:链表是有序的列表,但他是在内存中的存储如下:小结:(1)链表是以节点的方式来存储,链式存储。(2)每个节点包含data域,next域:指向下一个节点(3)如图:发现链表的各个节点不一定是连续存储的。(4)链表带头节点的链表和没有头节点的链表,根据实际需求来确定单链表的实例运用:使用带head头的单向链表实现——水浒英雄排行榜管理(1)完成对英雄人物的增删改查。(2)第一种方法在添加英雄时,直接添加到链表的尾部(3)第二种方式在添加英雄时,根据排名将英雄插

2020-07-11 09:21:15 264

原创 2.2 队列(数组队列模拟环形队列)

数组模拟环形队列数组队列问题:(1)目前数组使用了一次就不能用了,没有达到复用的效果(2)将这个数组使用算法,改进成一个环形队列解决办法:数组模拟环形队列,对前面的数组模拟队列优化,充分利用数组,因此将数组看做是一个环形的(通过取模实现)使用数组模拟环形队列的思路分析:思路如下:1.front变量的含义做一个调整:front就指向队列的第一个元素,也就是arr[front]就是队列的第一个元素front初始值=02.rear变量的:rear指向最后一元素的后一个位置,因为希望空出一个空

2020-07-10 10:49:23 112

原创 2.1队列(数组队列)

2.1 队列(数组队列)队列介绍(1)队列是一个有序列表,可以用数组或是链表来实现(2)遵循先入先出的原则。即:现存入队列的数据,要先取出来。后存入的要后取出数组模拟队列(1)队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxsize是该队列的最大容量。(2)队列的输出,输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变。当我们将数据存入队列时称为“ad

2020-07-09 22:56:59 265

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除