自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(234)
  • 资源 (1)
  • 收藏
  • 关注

原创 c语言之字符串的集合存放形式

那么这个时候问题来了,没有在第一次初始化的时候赋值字符串,那么又该如何操作呢?

2024-04-16 17:22:38 854

原创 手撕HashMap源码2

问题1:当我们在扩容的时候,如果当前节点是红黑树的实例,他在节点迁移之后,他还会是一棵红黑树吗答案是不一定,迁移当前桶位以及后面的节点,它是变成一棵红黑树还是单链表,取决于当前链表的迁移数目,是否大于链化阈值,如果当前链表的节点,比如低位链表的节点数目小于等于链化阈值,默认是6这个值,那么他就会把这棵树变成一个单链表存放,也就是说它会调用untreeify方法,内部会返回一个带头节点的单链表。问题2:如果当前桶位是一个树化节点,他一定会被重新树化吗?

2023-12-19 16:56:52 809

原创 手撕HashMap源码1

其实就是在数组上面,然后不按照固定的索引去存放数据,这也是利用数组支持按照索引下标进行随机性访问的特性。其中,索引的随机生成并且保证它的唯一性,就是我们哈希表的重要任务那么这个哈希值怎么算出来呢,一般我们会通过一个散列函数去进行计算得到,比如在HashMap的源码里面有下面这个散列函数上面这个哈希函数可以自行设计,它的设计思想就是先拿到key的原始哈希值,这个是系统给我们实现的函数函数,在Java中,每个类都继承自Object类,而Object类中有一个默认的hashCode()方法。这默认的。

2023-12-08 10:18:26 1029

原创 leetcode LCR24反转单链表

这个代码里面我加了我自己写的测试数据,自己可以去找对应的部分,直接粘贴赋值就可以在leetcode提交成功,我们就没有把迭代与递归单独分开了,里面还有大量的注释说明,请结合题目分析仔细观看。c语言版本测试代码,仅做参考。好了,祝早安,午安,晚安。

2023-11-28 20:11:22 589

原创 leetcode42接雨水问题

【代码】leetcode42接雨水问题。

2023-11-27 15:53:52 595

原创 java并发编程之基础与原理2

假设处理器A,B和C同时向总线发起总线事务,这时总线仲裁(Bus Arbitration)会对竞。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中。争做出裁决,这里假设总线在仲裁后判定处理器A在竞争中获胜(总线仲裁会确保所有处理器都。此时处理器A继续它的总线事务,而其他两个处理器则要等待处理器A的。是读事务还是写事务),处理器D向总线发起了总线事务,此时处理器D的请求会被总线禁止。总线的这种工作机制可以把所有处理器对内存的访问以串行化的方式来执行。

2023-11-18 23:30:58 199

原创 树之手撕红黑树

简单说一下二叉搜索树与AVL树要学红黑树,首先你必须学会二叉搜索树,也就是二叉查找树,如果不会的同学,可以去看我写过的文章里面有那么这里我们来说一下AVL树他就是一个平衡二叉搜索树,什么叫平衡呢,就是一棵树维持一个稳定的二叉状态,维持一个稳定的高度,高度稳定了,它的查找时间复杂度也就低了,那么AVL树就是一个利用左右子树高度之差小于等于1的这样一个平衡因子来维持的树的平衡,一旦左右子树高度之差大于1,那么树就是开始旋转。下面来简单对比一下二叉搜索树和AVL树。

2023-11-18 00:29:58 245

原创 树之二叉排序树(二叉搜索树)

第三种情况:你删除的结点下面就是说还有左右子树,那么这个时候,我们就要去找到这棵树中序遍历结果之后的直接前驱或者直接后继,然后把这个前驱或者后继给按到删除结点这个位置上,将它下面的树移到被替换结点的位置。在上代码之前,先来说一下,二叉搜索树很多方法都利用了递归的思想,许多说明我都放到代码注释里面了,可以结合下面的这张图进行思维分析。再来看java的运行代码(algorithm/bst1)构造树的过程即是对无序序列进行排序的过程。通常采用二叉链表作为存储结构 不能。插入的新节点是以叶子形式进行插入的。

2023-11-11 07:57:28 188

原创 redis1之安装redis,启动,常用数据结构

是一个常见的系统目录,用于存放源代码文件。HSET key field value:添加或者修改hash类型key的field的值。SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行。HGETALL:获取一个hash类型的key中的所有的field和value。每一个数据类型的存储啊,它使用的命令都是不一样的 ,比如string类型。HGET key field:获取一个hash类型key的field的值。HKEYS:获取一个hash类型的key中的所有的field。

2023-11-02 12:12:59 189

原创 leetcode82删除排序链表中的重复元素

上面就是如果头结点与它的next结点的值一样,那么就把这个头结点的next交给move结点,然后内部循环是否继续相等,知道不相等的时候跳出循环,继续以move为头结点进行递归,一旦到了一个与next不相等的位置,那么就把这个当前move指针的next继续下面递归,直到最后next等于NULL时候,停止递归,开始返回数据。那么最早的头一定是最晚返回的数据,所以最后的head,一定就是头结点了。外部循环判定卡住的位置。好了,祝大家早安午安晚安。具体分析一下指针移动。

2023-11-01 13:56:34 144

原创 java并发编程之基础与原理1

当一个线程修改了变量的值后,会将新值同步回主内存,而其他线程在读取这个变量的值之前,会先从主内存中刷新(获取)变量的最新值,而不是直接从自己的工作内存中读取。下面讲一个Thread.yield(),他会释放当前线程的时间片,让当前线程进入一个可运行状态,并且保存数据,下次这个线程在次执行的时候,如果发现主内存已经修改了某个共享变量,就会从主内存去获取这个共享变量的值。,这个变量实际上在计算机内存中有两个位置保存着它的值:一个是主内存(主存,RAM),另一个是线程的工作内存(缓存,CPU缓存)。

2023-10-19 21:57:12 191

原创 单链表习题(对应章节chapter2)

这里说一下我用到自己之前写的一个单链表的动态库,不会的同学可以参考我在Linux专栏动态库与静态库制作,后面就不在多说了。参考代码:位置(/chapter2/c++/middle-link-list-node/lc1.cc)第一种思路分析:考虑指针移动到相应的位置来做。题目1:链表的中间结点。

2023-10-09 22:10:11 136

原创 javaee之Elasticsearch相关知识

比如:小米电视,他会查出小米相关的产品,会查出电视相关的产品,也就是小米与电视是进行分词处理的。某个结果查询多了就会在搜索结果中排的更高。我们可以去kibana看一下是否创建成功。下面为了测试聚合,我们创建一个新的索引。下面就是更改了id=1的所有数据。说一下查询之后,一些属性的含义。下面我们要用聚合创建的索引库。下面我们构建一个demo工程。我们还可以用下面的方式来查。下面是之前创建的一个索引库。这种类型的字段可以分词处理。看一下原始索引库的模板。下面是我索引库中的内容。我们可以查出所有的数据。

2023-10-08 15:53:10 284

原创 算法的时间复杂度分析习题专题1

时间复杂度为O(nlogn)明显与题目要求不符合,no_pass。之前写了一篇重点是讲理论,今天重点在于对于题目的分析。题目难度不分先后,有题目来源会直接给出链接或者位置。下面是第二种思路分析。时间度O(n),通过。

2023-09-29 17:50:33 454

原创 javaee之通用mapper

这个是通用Mapper的一个基础类,继承这个类,传入我们需要的一个实体类对象,就可以在这个类里面轻松实现对表的数据操作,而无需写任何多余的sql语句,注意这个类是一个接口。这里说一下上面返回的Page对象,其实他就是一个LIst对象,只是它带了一些分页的信息在里面。它本身就依赖一个jpa的依赖,通用mapper的整体依赖就包含了通用mapper的核心依赖。其实就是插入的语法,里面是包含的哪一个表,一个实体对象进来其实就是一个数据表进来嘛。看一个下面的情况,为什么还可以接收Page这个对象,这个是个什么?

2023-09-26 19:40:22 496

原创 javaee之黑马乐优商城6

另外还需要注意的是,这个整体的大表单数据是向spu这张表里面做的插入,所以我们必须给spu进行属性的扩展,扩展一些spu本身没有的属性,但是客户端又会传给我们的数据。我们去数据库里面看了一下,本身来说,sku里面是没有stock这个字段的,而这个字段是保存在tb_stock里面,又从某种情况来说,sku表与stock表是一张表。这里的想表达的是什么意思,其实就是当我们添加完了这个商品的最后,我们要添上我们新添加的商品的参数啊,但是这些参数是什么,我们需要通过关联分类id去找这个参数。

2023-09-26 19:11:11 1251

原创 javaee之黑马乐优商城5

我们大致想一下,id,title有个标题,sub_title子标题可能有,可能没有,然后我们还要考虑与分类的关系,我们之前是通过手机这个分类,找到它相关的参数组,然后通过参数组,又去找它具体的子参数,具体的子参数找到了,然后我们就要去找它具体的值,这个值在什么地方存在?我们查询spu的时候,根据不同的sku组合,我们需要取出这些特殊的键值对 ,那么这里的设计就是,我们选择上面各自分组当中的哪一个值,也就是下面这些组合当中,我们从中怎么去抽取。比如内存,颜色,这就是sku,比如下面这一段参数。

2023-09-21 00:59:50 403

原创 javaee之黑马乐优商城4

这张表就是规格参数组表的每一个组对应的具体的规格属性,这个可以这样来理解,就是参数组表里面存放的是表头,具体的规格参数名是放在这个规格参数表名里面,这张表的名字是tb_spec_param(明显与参数数组表是一个一(tb_spec_group)对多(tb_spec_param)的关系)首先分析一下,父类与它的直接子类关联的字段就是parent_id,也就是在一棵树中,同级之间的兄弟子类的parent_id都是一样的,于是我们可以进行下面的sql语句查询。

2023-09-19 20:12:27 308

原创 javaee之黑马乐优商城3

上面还是保留一下原来的,我们配置一下现在的访问目录就行了,比如这个是/api/upload这样一个访问目录,也就是主机过来之后,遇到后面跟这样一个访问目录,就会跳到这个location位置给我们进行转发,但是,需要注意的一个问题是,这个配置必须写到location /这样一个位置前面,因为location \这个是一个相当于通配,并且它的配置级别比较大,/api/upload这样路径一过来,其实不止是这个路径,是任意路径一过来,一旦第一个匹配直接找到location /,那么就会进去,执行相应的转发代理。

2023-09-16 04:06:51 388

原创 手写模拟Spring的底层原理2.1

上面就是拿到类加载器,然后去调用getResource(),里面传入一个你需要查找类的相对包的路径,然后会给我们返回一个URL ,这个URL就是一个在target上面的绝对路径,他包括了整个硬盘的位置。既然这样,那么我们创建对象的工作,就必须放到容器的构造函数里面执行,也就是说,san包扫描完成之后,把相应的对象信息都放到集合里面去了之后,就要卡死给我们生产对象。单例必须保证每次取出来的对象都是同一个对象,我考虑用一个集合来做,如果同一个对象过来,都从集合里面取出唯一的键,然后获取固定的对象不就好了。

2023-09-14 23:49:46 227 1

原创 Spring底层的核心原理解析

假设这个admin是我们管理员账号与密码,我们想的是UserService一旦被Spring 创建,那么里面的Admin就要自动填充好值,如果说给Admin添加一个Autowired当然也是可以,但是如果这样的话,那么拿到的值就不是我们想要的,因为admin需要我们去查询数据库,然后封装一个User对象,然后在给到他,但是spring是真不知道怎么去查数据库,去查什么表的。我们知道Spring是会帮我们创建一个UserService对象,那么他与我们直接new出来的一个对象有什么不同呢?

2023-09-14 15:31:39 162

原创 springMVC1之ModelAttribute注解

然后在主体方法上,把我们在showUser保存的对象引入进来,因为是保存在map集合当中的,所以我们直接引入map结合中的User对象对应的键就可以了。我们在调用实际的Controller方法之前,可以返回一个从数据库中查到的一个User。把日期设置了一下成为当前的日期,我们看一下前端传过来的页面是没有日期的。下面我们展示不返回对象,直接把对象封装到map集合里面的用法。注意没有提交日期,然后我们去看一下这边的控制台。然后我们在去调用实际的方法,比如下面这个方法。也就是说访问的是控制器里面下面这个方法。

2023-09-12 17:42:49 216

原创 普通的maven里面没有配置tomcat服务器问题

为什么跳转到这个页面呢,原因在于我们在tomcat服务器里面的配置文件web.xml做了如下配置。他会直接给我们跳转到 webapp下面的index.jsp页面。只要webapp下面有如上几个页面,就会被默认运行。如果运行中出现控制台中文乱码,按照如下解决方案解决。上面的意思也就是可以直接如下访问。

2023-09-12 16:50:37 210

原创 有效回文字符串(Valid palindrome)

正确的方法来检查字符串是否为空。如果你尝试将空指针传递给这个函数,编译器会报错,因为它不接受指针作为参数。所以不需要额外检查指针是否为 NULL。1.这里引入了c语言当中的一个头文件,去进行字符判断的操作。2.下面这里为什么不进行NULL的判断。上面的时间算法复杂度还是O(n)下面分析一下它的时间复杂度。所以时间复杂度是O(n)

2023-09-12 01:15:17 99

原创 最长回文子串(Longest Palindromic substring)

第一个:关于-1/2=0,本来应该是-0.5,但是1与2都是整型嘛,然后后面就截断了 0不占符号位,如果还是-4/2 = -2,这个时候就得有符号位。第二个:printf()不能打印char*的c语言类型的字符串,所以字符串可以调用c_str()函数变成包含了c语言指针的字符串。就是正读和反读都是一样的字符串,比如aba,abba,cdc像这样的字符串都是回文字符串。这个图解的意思就是我们要拿到每一个右边的数,然后与左边的数一一匹配。下面用图解的方式对c++的部分进行分析。下面看一下java的实现代码。

2023-09-11 14:13:07 410

原创 java小贴士之传入引用变量的问题

在c++里面我们可以加一个&来引用一个参数,这个其实就是直逼传进来参数的内存地址,因为函数正常情况下是按值进行传递,这里是直接逼向内存地址,比如做如下限定。但是在java里面是不能这样限定的,我们如果想要修改某个变量的值,我们就把它放到一个对象里面,因为普通变量都是按照值传递,也就是说把这个值给到一个副本过去。那我们这里传一个引用对象,然后修改引用对象里面的变量值。加一个const是限定这个字符串不能随便修改。

2023-09-11 01:11:04 97

原创 java面试之ThreadLocal问题

假设key是弱引用的情况下,ThreadLocal引用没了,map 里面是一个弱引用指向ThreadLocal,那么就表明ThreadLocal会马上被垃圾回收器给回收掉,他一回收掉,Key就为NULL,那么我们就再也无法访问到value ,value无法被回收,会导致内存泄漏。synchronized:它的效率会低一点,因为相当于就是说,线程是排队进行访问的,就像一个教室只有一个厕所,大家都要进去上,就要排队。我们正常的引用一个对象,没有指向的时候,就会被gc掉,也就是垃圾回收器给回收掉。

2023-09-05 21:29:05 401

原创 java之多线程

要么继承这个类,要么通过去实现Runable接口,然后通过Thread构造函数传进行传入,然后在调用star()开启run里面的线程代码。阻塞状态:遇到sleep方法,join方法,失去了可运行资格,要是在运行,必须先回到可运行状态抢夺时间片段。就绪状态:可运行状态,表示当前线程具有争夺cpu时间片的执行权,这里表他有即将可运行的资格。先来看一个类----Thread类 ,你要做一个线程,必然要和这个类有关系。第二种方式:去实现Runable接口,然后Thread类的构造参数进行传入。

2023-09-03 20:44:14 127

原创 javaee之黑马乐优商城2

也就是上面返回的是如下一个分页对象,在ly-common模块里面,如果需要用到这个模块的对象,那么我们就需要把这个模块当成依赖引入到另外一个模块里面。出现了一个小插曲,开始的时候,我maven项目右边的模块有些是灰色的,导致我导入依赖之后,所有的注解什么都不能用,解决方案如下。下面我们去看一下品牌表展示什么样的内容,我们看一下数据库里面的字段,先来创建一张产品表,然后把数据也给插入进去。下面我们再去编写一个实体类之前,我们去看一下这个类的请求方式,请求路径,请求参数,返回数据都是什么。

2023-09-02 15:54:20 700

原创 javaee之黑马乐优商城1

看一下上面的配置,监听的一个server_name是manage.leyou.com ,而这个在DNS网关里面是没有配置过的,所以需要在本地的Hosts里面进行一个配置,也就是在linux机器上做一个配置,但是没有去配,linux找不到这个ip地址.先来说一下,关于某个服务的配置,比如user-serive这个服务,它会被注册到eureka注册中心,那么这个服务就会发送一个心跳给一个eureka,告诉它,它是存在的,这个心跳的配置就是。另外需要再次说明的是,在IDEA对后端项目的配置上,不能这样去配置。

2023-08-28 12:03:04 495

原创 深度剖析堆栈指针

表达式3: printf("%d %d %d\n",(*pp_root)->left,root->left,&child->value);表达式1:printf("%d %d %d %d\n",&(*root),root,&root->value,&root);以前我写过一句话,就是说,如果看到一个*变量,那就是直逼这个变量所保存的内存地址,然后取出里面保存的对应的值或者地址,表达式2:printf("%d %d\n",&(*pp_root)->left,&root->left);这也就是它报错的原因。

2023-08-13 02:00:11 210

原创 关于二级指针保存一级指针的问题

上面是给到了两个函数,现在可以只给到一个函数,其实也很简单,你就在外部的话,直接就接受,第一次插入的地址就可以了嘛,但是考虑到每次传进来的pnode都一样,也就是说还是从根结点开始干,插入的时候要从根结点开始遍历。但是这里假如root保存的是一个空的地址,那么这棵树会串接到pnode上面,pnode是一个形参,它本身也是没有空间的,如果是一个结构体,先赋值给这个结构体一片空间。我们考虑传入一级指针呢?在写二叉搜索树的时候,碰到一个问题,就是利用二级指针来改变一级指针保存的地址问题。假设我就要传一级指针呢。

2023-07-24 23:16:14 268

原创 linux之vscod编译源代码

然后先来看一个配置文件launch.json的配置文件,这个配置文件主要配置了代码文件的调试信息。在本地的linux上首先要安装gcc与g++编译器,因为这个后面会写到配置文件里面去。先在这个软件里面安装上c/c++的扩展插件,然后当我们开始编译c/c++程序的时候。不要多配,每次配一个就好,就是不要多点击多添加配置。再来看tasks.json这个文件是程序的运行文件。vscode想要编译c/c++程序。会自动生成一个.vscode目录。这个也不要配置,配一个就好了。

2023-07-14 09:54:29 428

原创 Linux之磁盘管理

现在出现了一个问题就是,按照这种方式扩容,只能扩展最后一个分区上面的磁盘空间,我这里最后一个磁盘分区是sda3,也就是swap交换分区,我直接删除,然后再来扩容根分区的空间。如果根分区用完了,/home下面的分区空间还能用吗,对系统有什么影响。我这里把sda4空间给分了一个区,我们这里首先,把这个分区给删除掉。首先每一个分区都是独立的 ,基本上来说都是可以独立分配空间的。扩展完了之后,注意需要刷新根分区并查看状态。重复上面操作几次,分别给这个分区赋值。这是我们挂载上的第二块硬盘。删除根分区,注意不要保存。

2023-07-13 08:41:40 256

原创 jdbc数据库连接技术复习1.0

我们要拿到Connection这个链接对象,利用连接对象我们获取sql的statement执行对象,然后利用这个对象来获取相应的sql语句,然后返回结果。直接返回一个Statement的语句句柄对象。Statement与PreparedStatement:语句句柄执行sql语句用的。这一套接口应该都是放到java的jdk里面,也就是都能在jdk说手册中拿到。因此需要提供相应的jar,它是已经实现了这个接口的类。这个对象也是通过Connection对象来获取的。怎么来得到sql语句的执行句柄。

2023-07-04 15:49:59 127

原创 小球下落(dropping balls)uva679

在初始状态下,每一个结点是处于关闭状态,这里可以用0来表示,当一个球落到这个结点上的时候,结点状态可能改变,但是这个改变不一定是从0到1,也有可能之前打开过是1,然后又变成0,至于为什么要说这个,是因为,他会判定出小球的走向,比如当结点=0的时候,往左走,否则就往右边走。这里也就是说,如果结点是i%2=1,说明i是一个奇数球,这个球,会走左边,毕竟是0,那么它的下一个结点位置就是k=2k,左边,那么让它的下一个位置结点判定是奇数次还是偶数次,就是i = (i+1)/2,如果是奇数走左边,偶数右边。

2023-04-30 15:36:22 798 1

原创 五个钓鱼的男孩

五个孩子分别采用下列的方法瓜分他们的战利品,C把他钓到的战利品同B和D两人和在一起,然后大家各取其三分之一,别的孩子也这样做,也就是说每个孩子同他的左、右伙伴所捕捞的鱼都和在一起.等成3份,各取其一.D同C、E联合,E同D、A联合,A同E、B联合,B同A、C联合 .,A和B共钓到14条鱼,B和C共钓到20条鱼,C和D共钓到18条鱼, D和E共钓到12条鱼,而A和E,每人钓到的数量是一样的.五个男孩(A、B、C、D、E)有一天出去钓鱼。然后根据这个总数,来进一步分析。先来分析得出一个大概率的总数。

2023-04-07 17:45:56 135

原创 移动盒子uva12657

例如,如果n=6,则在执行1 1 4之后,该行变为2 3 1 4 5 6。然后在执行2 3 5之后,该行变为2 1 4 5 3 6。然后在执行3 1 6之后,该行变为2 6 4 5 3 1。然后在执行4之后,行变为1 3 5 4 6 2。每个测试用例以一行开始,该行包含2个整数n,m(1≤n,m≤100000)。•1 X Y:将方框X向左移动到Y(如果X已经是Y的左边,则忽略此项)•2 X Y:将方框X向右移动到Y(如果X已经是Y的右边,则忽略此项)表上一行有n个框,编号为1。•3 X Y:交换盒X和Y。

2023-04-04 15:22:31 253

原创 第 100002(十万零二)个素数是多少?

一般认为最小的素数是2,接着是 3,5,...第三:用已知的素数去筛选合数,避免重复筛选,避免重复筛选这个过程,就是一个位置,如果一旦被标记为合数之后,就不要重复标记为合数。第二:如果当前被筛选的是一个质数,那么质数*质数是可以筛选掉一部分合数,其实也是通过最小因子算出来的。讲一个查找20以内的所有素数,假定是查找到20,但是这个数据这个可能更大,这里我们用一种埃氏筛选法。请注意:“2” 是第一素数,“3” 是第二个素数,依此类推。确实能解决问题,但是运行的非常慢,时间复杂度是O(n)

2023-03-22 03:23:58 805 1

原创 Hrbust报数问题

题目描述有 N 个人围成一圈,按顺时针给他们编号为 1-N。紧接着,指定编号为 M 的人开始报数,报数按顺时针进行。报到 D 的人出列,下一个人重新开始报数。按此规律,每次报到 D 的人都出列。要求同学编程求出出列的顺序。输入输入包括多组测试用例。对于每组用例,第一行是一个整数 N,表示人数。N

2023-03-15 15:18:28 296

javaee之黑马旅游网3完整代码

javaee之黑马旅游网3完整代码

2022-12-09

javaee之黑马旅游网2第二部分完整代码

javaee之黑马旅游网2第二部分完整代码

2022-12-06

Javaee之黑马旅游网第一部分完整代码

Javaee之黑马旅游网第一部分完整代码

2022-12-04

javaee之黑马旅游网第一部分初始项目资料文件

javaee之黑马旅游网第一部分初始项目资料文件

2022-12-04

javaee之用户信息增删改查案例源代码及所有资源文件(IDEA版本)

内容包括了用户javaee专栏里面文章用户信息增删改查案例所有源代码与资源文件,整理不易,谢谢啦。

2022-05-24

空空如也

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

TA关注的人

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