自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java虚拟机垃圾回收(看一遍绝对就会了!!!)

JVM内存区域划分GC(垃圾回收)垃圾回收的两种手段java中的四种引用JVM内存区域划分首先我们先看看他会被划分为那几个区域1.堆(存放对象)2.方法区(存放一些静态的东西和一些修饰代码之类的)3.栈(局部的一些变量)4.程序计数器(存放的是下一条指令的地址)GC(垃圾回收)首先我们要明确为什么要垃圾回收?如果不垃圾回收,创建的对象越来越多,相对而言,能够分配的内训就会越来越少。这样服务器就可能宕机。这种我们称它为内存泄漏。垃圾回收的两种手段1.程序计数器(java中没有用到此方法.

2021-08-20 13:50:49 582

原创 JAVA中常用的安全集合类

Collections中的SynchronizedXXXVectorCopyOnWriteArrayListCollections中的SynchronizedXXX拿一个SynchronizedList来说吧从构造方法来看,他需要传入一个List类型的实例。可以看到他的全局都是一把锁,多个线程进来,无论是读-读,读-写,写-写都是需要进行排队的,所以并发效率就会很低。Vector// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。Ve.

2021-08-17 18:02:44 777

原创 JAVA中的一些锁概念

文章目录乐观锁和悲观锁读写锁重量解锁和轻量级锁自旋锁公平锁和非公平锁可重入锁和不可重入锁死锁CAS(compare and swap)比较并交换synchronized的锁升级过程乐观锁和悲观锁乐观锁:这个锁认为出现锁竞争的概率比较低(当前线程中,线程数量较少,不太涉及竞争,就偶尔竞争一下)悲观锁:这个所认为出现锁竞争的概率比较大(当前场景中,线程数目比较多,可能涉及竞争)读写锁普通的锁提供两个操作:加锁,解锁读写锁提供三个操作:读加锁,写加锁,解锁。读加锁和读加锁:不需要互斥写加锁和写加锁

2021-08-15 23:02:49 935 7

原创 HTTP知识点整理

1.什么是HTTP协议HTTP请求:由首行 请求头 空行 BodyHTTP响应:由首行 响应头 空行 Body例如构成以上两种格式的字符串进行交互,就叫做HTTP协议。2.常见的HeaderHOST:主机名Content-length 内容长度Content-type:内容类型User-Agent:声明用户操作系统和浏览器版本Referer:当前的页面从哪个页面跳转而来Cookie:存放用户的少量信息3.HTTP状态码1XX:信息性状态码,接收的请求正在处理2XX:成功状态码,请

2021-08-13 21:25:00 215

原创 二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。序列化的意思是将二叉树转换为一个字符串,反序列化的意思是通过转换的字符串重新建出二叉树。就拿第一个意思说吧,我的思路是通过前序遍历的方法将他转化为字符串

2021-08-13 01:14:25 83

原创 合并k个有序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。这个问题,我个人有两种解法,一种是根据归并排序的思想,每两个有序链表进行合并,最终合并为,一个最大的有序链表;还有一种解法是利用PriorityQueue做,可以建立一个小根堆,和一个傀儡头节点,每次将最小的链表取出, 将最小链表的头结点放到傀儡链表中,并且判断当前节点的下一个是否为空,若不为空,就将它的下一个节点作为头结点放进优先级队列中去,若为空,就不用放了。分治思想public ListNo

2021-08-11 00:28:23 165

原创 LRU缓存机制

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。那么我们怎么能够实现一个LRU缓存呢?1.先创建两个哨兵节点,一个为head,一个为tail;创建这两个节点作用就是更加容易的插入和删除,我们将要插入的节点从tail节点的地方插入进来,要删除的节点放在head的写一个节点。...

2021-08-10 19:19:54 102

原创 创建单例的4种方式

文章目录饿汉式懒汉式静态内部类式双重if判断饿汉式public class TestSingleton1 { //饿汉式单例 private static TestSingleton1 instance = new TestSingleton1(); private TestSingleton1(){ } public static TestSingleton1 getInstance(){

2021-08-10 16:54:31 1208

原创 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。这个题什么意思呢?右视图我们应该都懂吧,其实看开一点,就是让你求每一层最右边的那个节点的值,使用层序遍历就行,每次将每一层最右边的节点保存到一个list集合中去.我就直接写代码了. List<Integer> ret = new ArrayList<>();//创建一个list集合 public List<Integer> rightSideVi

2021-08-10 01:45:23 715

原创 synchronized和volatile关键字

文章目录synchronized关键字volatile关键字synchronized关键字synchronized功能就是可以保证原子性,指令重排和内存可见性.如图所示:他会等线程一解锁之后,自己进行加锁再执行自己的逻辑代码.synchrinized使用的几种方式.1.在普通方法前加上synchronized: static class Test{ int count = 0; public synchronized void method(){

2021-08-09 19:02:51 85

原创 线程安全问题

一.由于线程之间是"抢占式"执行的过程,这些线程谁先执行谁后执行,不能确定,完全取决于cpu的调度,所以这也是线程不安全的罪魁祸首.二.多个线程同时修改统一个资源我们哪count++这个例子解释一下,count++这个操作就是针对内存中的count变量进行修改操作,修改操作一般都是cup来完成的,分为三个步骤:1.先把内存中的数据读取到cpu的寄存器中.2.针对寄存器中的内容,通过add这样的指令+1操作,操作的结果仍然保存在寄存器中.3.把寄存器中的数据,写回到内存中去.绘图描述以下可能发生线

2021-08-09 13:37:51 89

原创 java多线程中常用的方法

join方法join()方法是让当前线程阻塞.通俗的话说,就是在哪个线程调用哪个线程就阻塞,让调用join方法的线程在它前面执行完.join方法你可以将它想象为"插队",他不能保证哪个线程先开始.但是了以保证哪个线程先结束.给大家看个例子:只有当线程t1结束,只能是main将标志位设置为false,但是显然是不可能的,线程t1,无限循环,所以这个方法就不可能结束.interrupt方法interrupt方法分两种情况:1.如果当前线程内部执行的逻辑不涉及sleep这样的等待,此时就会通过标记

2021-08-09 00:48:52 221

原创 Java多线程(创建多线程的几种方式)

这里写目录标题继承Thread实现多态实现Runnable接口,将实现的类对象传入Thread构造器中通过匿名内部类来完成通过java8新特性Lambda继承Thread实现多态 static class MyThread extends Thread{ @Override public void run(){ System.out.println("Create 1"); } } public s

2021-08-08 18:27:41 65

原创 搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一个整数 ta

2021-08-07 19:13:35 52

原创 二叉树的最大路径和问题

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 .因为要求是任意节点,且不一定经过根节点,后序遍历可一将子树的情况全部收集返回, 那么一条路径 = root.val 可能加上 path(left) 可能加上 path(right) 如果子路径是负数,那么就舍弃掉,因为加上负数只会

2021-08-07 13:00:12 167

原创 求三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。这个题目怎么说呢,他不是很难,但是有很多细节需要考虑,例如:该怎么去重,边界值怎么写等等.我来说说这个题的具体思路.我们首先可以将数组排个序,然后确当前一个值,通过双指针的形式在当前值的下一个和最后一个值开始查找,找的过程中难免会遇到重复的元素,当遇到重复的元素我们可以跳过他.下来我给大家看看具

2021-08-06 22:55:08 117

原创 LCA问题

题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。示例 1:解题思路:祖先的定义: 若节点 p 在节点 root 的左(右)子树中,或 p = root,则称 root 是 p 的祖先。最近公共祖先的定义: 设节点 root 为节点 p, q的某公共祖先,若其左子节点 root.left 和右

2021-08-06 12:51:24 94

原创 HashMap的put和resize

简介Map集合使我们经常使用的一种集合类,我们先看看它的继承图:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用Concurre

2021-08-05 20:44:44 202

原创 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事.首先你的要在浏览器输入要访问的网址1.2. 浏览器查找域名的ip地址导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。

2021-08-05 18:43:23 321

原创 复制带随机指针的链表

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链

2021-08-05 13:38:06 61

原创 栈的压入、弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), p

2021-08-04 23:52:47 49

原创 删除有序数组中的重复项

题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成示例 1:示例2:刚拿到这个题的时候,人还是有一点懵的,但是仔细想了想,其实并没有那么难,只需要判断它的前一个是不是和当前元素相等就行了.如图:假如我现在有一个如上图的一个数组,我们不需要动下标0的元素,这样我们就可以从下标1开始遍历.我们先定义一个idx下标,idx下标从

2021-08-03 18:34:05 811

转载 中缀表达式-前缀表达式-后缀表达式

文章目录中缀表达式前缀表达式后缀表达式中缀表达式简介中缀表达式就是常见的运算表达式,如(3+4)×5-6;前缀表达式简介前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前;比如:- × + 3 4 5 6前缀表达式的计算机求值从右至左扫描,将6、5、4、3压入堆栈;遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;最后是-运算符,计算出35-6

2021-08-03 13:20:35 640

原创 用队列实现一个栈

题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、s

2021-08-02 23:47:25 104

原创 浅谈IP协议(三)

文章目录路由MAC地址ARP协议DNS(应用层协议)路由在复杂的网络结构中, 找出一条通往终点的路线;路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.IP数据包的传输过程也和问路一样.当IP数据包, 到达路由器时, 路由器会先查看目的IP路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;依次反复, 一直到达目标IP地址;那么如何

2021-08-02 16:41:14 78

原创 实现最小栈

题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,nul

2021-08-02 13:00:29 74

原创 带权的最小路径和

题目描述:给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。注意:你每次只能向下或向右移动。示例:输入:[[1,2],[5,6],[1,1]]输出:8题目链接:https://www.nowcoder.com/practice/23462ed010024fcabb7dbd3df57c715e?tpId=46&tqId=29115&tPage=1&rp=1&ru=/ta/leetcode&q

2021-08-02 00:09:06 330

原创 浅谈IP协议(二)

文章目录IP地址的数量限制私有网络和共有网络路由IP地址的数量限制我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右.而TCP/IP协议规定, 每个主机都需要有一个IP地址.这意味着, 一共只有43亿台主机能接入网络么?实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,

2021-08-01 19:17:02 748

原创 环形链表的入口节点

题目描述:对于一个给定的链表,返回环的入口节点,如果没有环,返回null;题目链接:https://www.nowcoder.com/questionTerminal/6e630519bf86480296d0f1c868d425ad推论如下:可以定义一个快指针和慢指针,快指针每次走2步,慢指针每次都走一步,那么他们在环中一定会相遇.代码: public ListNode detectCycle(ListNode head) { ListNode slow = head; //

2021-08-01 12:12:20 529

原创 浅谈ip协议(一)

文章目录基本概念协议头格式网段划分特殊的IP地址基本概念主机: 配有IP地址, 但是不进行路由控制的设备;路由器: 即配有IP地址, 又能进行路由控制;节点: 主机和路由器的统称;协议头格式4位版本号:指定IP协议的版本,对于IPV4来说,就是4;4位头部长度:IP头部的长度是多少个32bit,也就是length*4的字节数,4bit表示的最大数字是15,因此IP头部最大的长度是60字节.8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和

2021-07-31 21:46:31 133

原创 根据前序遍历和中序遍历确定一颗二叉树

解题思路1.先是找到根节点preorder[0]同时找到它对应在中序遍历中的位置index,可以写个方法去获取他在inorder中的位置2.必须搞清楚中序遍历和前序遍历之间存在的关系.3.根据在inorder获取的preorder[i]的下标,可以将inorder分为两半,一半是当前节点的左子树,一半是当前节点的右子树.话不多说上代码: public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder

2021-07-31 13:02:07 647

原创 TCP三(延迟应答,捎带应答,面向字节流(粘包问题))

文章目录延迟应答捎带应答面向字节流延迟应答什么是延迟应答?举个栗子:每天早上我要去给超市老板送货,卸完货后老板说明天给我送50箱。这样的过程就向滑动窗口一样给发送方返回剩余缓存空间。而延迟应答就好像早上给老板送货,送货完后老板说晚上给你打电话告诉你明天送多少,到了晚上超市老板打电话来说明天再给我送100箱来。延迟应答就是这个原理。如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小,所以会延迟发ACK,因为延迟的这段时间,应用程序就会把缓存区的数据取走,从而缓冲区变大,发送方就可以发更多

2021-07-30 22:38:47 251

原创 约瑟夫问题(数组模拟,环形链表)

文章目录问题起源解法一:数组模拟解法二:链表模拟问题起源据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k

2021-07-30 11:43:45 124

原创 环形链表问题

判断链表是否有环问题题目描述:给定一个链表,判断链表中是否有环思路: 可以明确的是:若一个链表带环,那么用指针一直顺着链表遍历,最终会回到某个地方。 我们可以定义两个指针(快慢指针),两个指针均从表头开始同时遍历链表,快指针一次走两步,慢指针一次走一步。如果链表带环,那么快慢指针一定会相遇,否则快指针会先遍历完链表(遇到NULL)。 若是你不明白为什么链表带环,快慢指针就一定会相遇,那么你可以想想龟兔赛跑: 代码如下: //给定一个链表,判断链表中是否有环 public bo

2021-07-29 23:30:20 132 2

原创 TCP协议二 (滑动窗口,流量控制,拥塞控制)

文章目录滑动窗口流量控制拥塞控制滑动窗口如果只是一发一收这种方式(如上图)虽然可靠性保证了,但是未免速度太慢了吧。。。为了改进这种方式,TCP协议加入了滑动窗口这个概念。什么是滑动窗口呢?说直白点吧。假如我去逛商场,想买杯COCO奶茶,也想买铁板牛筋,还想买点牛肉饼。店家接到订单后才会开始做,我不可能等一个做好再去买下一个吧,我肯定是在这边下完单再跑去其他两家店下单,目的就是为了重叠无用的等待时间。滑动窗口就是这个原理(如下图)。那么有了滑动窗口怎么保证数据传输的可靠性呢?场景一:丢ACK:

2021-07-29 23:13:42 154

原创 TCP协议一(确认应答机制,超时重传机制,连接管理机制)

文章目录解释确认应答机制超时重传机制连接管理机制(三次握手,四次挥手)解释TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制;TCP协议格式源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;32位序号/32位确认号: 后面详细讲;4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4= 606位标志位:URG: 紧急指针是否有效

2021-07-28 23:35:17 292

原创 hashcode和equals的区别

文章目录hashcodeequals为什么重写equals也要重写hashcodehashcode这是一个本地方法,不同的虚拟机有不同的实现(具体实现自己看虚拟机源码哈)。Object默认的hashCode是根据对象的内存地址转化而来的,它是唯一的。相当于堆上维护这一张hash表,每个对象再放入对上之前都会相转化成哈希码,然后hash码作为key键判断堆上是否存在和它相同的,若相同就要根据equals判断是否是同一个对象equalsequals是属于Object的原生方法,底层默认也是判断两个对象

2021-07-26 17:39:21 40

原创 二叉搜索树转双链表

二叉搜索树转双链表图解代码片段图解因为双链表有int val, Node pre和 Node last 字段 ,相应的树的段有 int val , TreeNode right , TreeNode left 字段 , 因为一个二叉搜索树通过中序遍历完成之后 ,结果一定是有序的 ,所以我们可以根据中序遍历节点走势可以看出 , pre 对应的是 left , last 对应的是 right.代码片段//pre节点总是记录当前节点的前一个节点 TreeNode pre = null;

2021-07-26 17:16:38 71

原创 有关二叉搜索树的一些操作

二叉搜索树的相关操作二叉搜索树介绍查找插入删除二叉搜索树介绍二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3.它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};查找实现如下public boolean search(int key) { if(root == null) {

2021-05-21 14:08:51 71

原创 Java中的7种排序

Java中的7种排序冒泡排序选择排序直接插入排序希尔排序堆排序快速排序归并排序冒泡排序冒泡排序的思想就是就是相邻的两个依次比较,如果是升序:总是先将最大的放在最后,然后是第二大放在倒数第二的位置,依次往下重复.时间复杂度:O(N^2)空间复杂度:O(1);稳定性:稳定 public static void bubbleSort(int[] arr){ for(int i = 0 ; i < arr.length-1; i++){

2021-05-17 17:40:38 80

空空如也

空空如也

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

TA关注的人

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