自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 前端不显示验证码图片

使用了 AWT 来生成图像,而 Spring Boot 应用是在没有图形环境的情况下运行(例如在 Docker 容器中)时,这时尝试了加载图形组件。(解决方案是在 java 启动参数中添加参数 "-Djava.awt.headless=true",采用 headless 模式运行 java 应用 )查看日志,发现验证码正确生成了,但是在 docker 容器中缺少图形化界面,不能正确加载验证码对应的字体(找不到对应的类)打开控制台,发现验证码图片对应的响应状态码为500,是服务端的问题。库生成验证码的时候。

2024-12-31 21:52:29 691

原创 mybatis 和 mybatisPlus 兼容性问题

会调用到 mapper 提供的方法,根据错误递归栈发现后续直接走的 mybatisplus,没有走 mybatis,而我的 mybatisPlus 配置的 classpath 和 type-aliases-package 并没有包含UserMapper 对应的 xml 文件。项目采用的是 mybatis, 后续引入了 mybatisPlus,用 mybatisX 创建的四个类一直报错,提示找不到符号,意识到 mybatis 和 mybatisPlus 的兼容性问题,通过修改配置 两者的配置如下。

2024-12-31 21:50:26 1342

原创 IDEA 打开 maven 的 settings.xml 文件

右键 pom.xml -> 选中 Maven -> 选择 open settings.xml。

2024-12-21 16:25:30 715

原创 Leetcode 检测相邻递增子数组

给你一个由n个整数组成的数组nums,请你找出k的,使得存在且长度为k的子数组。具体来说,需要检查是否存在从下标a和ba < b) 开始的b = a + k返回k的值。是数组中的一个连续的元素序列。

2024-11-11 11:09:14 856 1

原创 遍历集合的三种方式

2) 通过 Iterator 对象的 hasNext() 方法判断 Iterator 对象指向的位置是否还有元素。1) 先通过 集合的 iterator() 方法获取 Iterator<T>对象,T 为集合里的元素类型。1. 集合的 forEach 方法,可通过 lambda 表达式对每一个元素进行操作。3) 若有元素,则通过 Iterator 对象的 next() 方法获取元素。3. 通过增强 for 循环遍历。2. Iterator 方法。

2024-10-03 21:11:11 264

原创 LeetCode 2304. 网格中的最小路径代价

定义 dfs(grid,i,j,moveCost) 为从 [ i, j ] 出发到达最后一行所需要的最小的代价。对于一个 节点(i,j),可以移动第 i -1 行的任一列节点,取出这些节点到最后一行的代价的最小值,再加上(i ,j )节点自身的价值 grid [ i ,j ] 即是 从[ i, j ] 到达最后一行所需要的最小的代价值。同时还引入了 memo 数组将已经计算过的节点的最小的代价保存起来,避免重复计算。一条路径的代价是:所有路径经过的单元格的。最后一行的单元格移动的代价可以忽略。

2024-10-03 20:18:48 396

原创 LeetCode 120. 三角形最小路径和

设 dp[ i ][ j ] 为走到 第 i 行,第 j 列处最小的路径和。每一个节点( i ,j ) 的最小路径和 只能由其上一层中节点(i-1,j ) 和 节点(i-1,j-1)(如果有的话)中得来。所以状态转移方程为:dp [ i ][ j ] = Math.min(dp[ i-1 ][ j ],dp[ i-1][ j-1]) + row.get( j )。初始化时,由于是求最小路径和,所以可以将所有节点的最小路径和都取为最大值。最后再在最后一层的所有节点的最小路径和中取最小值。

2024-10-02 18:11:08 591 1

原创 接口和抽象类的区别

1)接口的成员方法默认为 public abstract,(jdk 8 之后才有 static 和 default 方法),抽象类的方法可以有具体实现。2)接口的成员变量默认是 public static final 的,而 抽象类的成员变量 可以是各种修饰符修饰的。抽象类是对一个类的属性和行为进行抽象,是自下而上的设计,从多个类中抽取共性。接口是一些行为进行抽象,是自上而下的设计,实现了接口的类拥有对应的行为。3)一个类不可以继承多个抽象类,但可以实现多个接口。2. 语法方面的不同。

2024-10-01 15:30:27 462 2

原创 redo log 和 bin log 的两阶段提交

再根据 XID 去 bin log 中进行查找,如果 bin log 中不存在 XID,则说明 虽然 redo log 刷盘了,但是 bin log 没有刷盘,此时会进行事务回滚(根据 undo log 回滚)如果 bin log 存在 XID,则虽然 redo log 处于 prepare 状态,但 bin log 已经刷盘了,此时会对事务进行提交。会首先查看 redo log 的状态,如果 redo log 的状态为 commit,则说明事务的两阶段提交已经完成,可以放心进行数据恢复。

2024-09-30 14:25:55 907

原创 LeetCode 918. 环形子数组的最大和

综上所述,整个环形数组的非空最大子数组和为 masS 和 sum - minS 之间的最大值,当 sum == minS 时,此时 最小子数组和的子数组 可以等于整个数组,那么 环形数组的 最大子数组为空,不合题意,直接返回 maxS。(可以为空),同理,设 f [ i ] 为以 nums[ i ] 结尾的最小子数组和,则 f [ i ] =Math.min(f[ i-1],0) + nums[ i ]。二,最大非空子数组和 跨越首尾,此时 子数组和 + 其余元素和 = sum (nums) = 常数。

2024-09-30 12:56:05 577

原创 LeetCode 1749. 任意子数组和的绝对值的最大值

f[ i ] 为两者中的较大值,即 f [ i ] = Math.max( f [ i - 1] + nums[ i ],nums[ i ]),即 f [ i ] = Math.max( f [ i -1],0) + nums[ i ]。同理,设 g[ i ] 是以 nums[ i ] 结尾的子数组的和的最小值。每次计算出 f [ i ] 和 g[ i ] 之后,都比较一下 Math.abs( f[ i ],-g[ i ]),其结果为以 nums[ i ] 结尾的子数组的和的绝对值的最大值。

2024-09-29 20:10:14 632 1

原创 LeetCode 53. 最大子数组和

一是 nums[ i ] 作为前面的子数组的一部分,此时 dp [ i ] = dp[ i-1] + nums[ i ];二是 nums[ i ] 作为一个新的子数组,此时 dp[ i ] = nums[ i ]。故递推公式为 dp[ i ] = Math.max(dp[ i-1] + nums[ i ], nums[ i ] )。贪心思路,取一个变量 cnt 记录当前子数组的和,如果 cnt < 0,这时就应该舍弃原来的子数组,将 cnt 置为0,重新记录新的子数组的和。是数组中的一个连续部分。

2024-09-29 16:57:04 444 1

原创 Leetcode 213. 打家劫舍 II

的区别在于前者的 最后一个房子和第一个房子是相邻的。如果偷盗第一个房子,则 第二个和最后一个房子不能偷盗,即剩下的偷盗范围是 第三个房子至倒数第二个房子。如果不偷盗第一个房子,则剩下的偷盗范围是第二个房子至最后一个房子。你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。同时,相邻的房屋装有相互连通的防盗系统,你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。

2024-09-28 18:48:40 402

原创 Leetcode 2320. 统计放置房子的方式数

一、若选择放置,则 第 i -1 个地块不能放置,第 i -2 个地块可以放置也可以不放置,故 此时 前 i 个地块的放置方案数等于前 i -2 个地块的放置方案数。二、若选择不放置,则第 i -1 个地块处可放置也可不放置,前 i 个地块的放置方案数等于前 i -1 个地块的放置方案数,即 f [ i ] = f [ i - 1]。由于 在第 i 个地块处有两种选择,不同的选择带来的结果的总和是前 i 个地块的放置方案数总和。所以 f [ i ] = f [ i -1] + f[ i -2]。

2024-09-28 11:28:46 550

原创 Leetcode 740. 删除并获得点数

一是选择不删掉 i ,则得到前一个数字 i-1 位置上的最优结果, dp [ i ] = dp [ i - 1];二是选择删掉 i,当选择删掉 i 时,i -1 和 i+1 都会被删除,所以 dp[ i -1 ] 不可以计算到结果中。则得到 i-2 数字位置上的最优结果 加上 当前数字 i 乘以 当前数字 i 的个数, dp [ i ] = dp[ i -2] + i * all [ i]。遍历顺序,由于 dp[ i ] 依赖于 dp[i-1] 和 dp[i-2] ,所以从前往后遍历。

2024-09-28 09:22:26 481

原创 LeetCode 2266. 统计打字方案数

可以这样理解,举个例子:222, 222 的字符串信息是 f [ 3 ], 则 可以将最后三个字符 222 当作一个字母 c 看待,则 222 能表示的字母字符串 只有 c,信息数量为 1,剩下的字符串为空,表示的字母字符串信息数量为 f [ 0 ];222,可以将最后两个字符当作一个字母看待,则 222 可以看作 2b,其中后两个字符 22 所代表的字符串信息是b,是确定的,信息数量可以视作1,第一个字符 2所代表的字符串信息只有 f [ 1 ] = 1;一个字母,Alice 需要。

2024-09-28 00:11:54 844

原创 mapstruct, lombok log 找不到符号

位置: 类 com.cqnu.message.controller.MessageNotificationController。参考:https://www.cnblogs.com/jichi/p/16950932.html。Mapstruct 和 lombok 的依赖顺序,需要 lombok 的顺序在前。当POM中不包含Lombok时。当POM中包含Lombok时。java: 找不到符号。符号: 变量 log。

2024-09-08 11:11:52 388

原创 @Retention 是什么

这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。是注解的注解,即元注解,搭配 RententionPolicy 使用。RetentionPolicy 是一个枚举类。如果只是做一些检查性的操作,比如源码中的。

2024-08-28 13:40:07 271

原创 LeetCode 31. 下一个排列

2.若 nums[ i ] > nums[ i -1 ],则对 i 至 len 的 nums 数组进行升序排列,取排好序的数组中最小的但是大于 nums[ i - 1] 的数字与 nums[ i - 1 ] 进行交换。比如:123465 ,检测到 nums[ i ] 为6 > nums[ i-1 ]为4之后,对 65进行排序得到 56,且 5 大于 4,则交换 5 和 4 的位置,123465 的下一个排列为 123546。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。

2024-06-18 17:15:40 761

原创 Leetcode 84. 柱状图中最大的矩形

二、当当前柱子 i 的高度等于栈顶元素所对应的柱子的高度时,可以将当前柱子的下标 i 直接入栈,也可以先将当前栈顶元素弹出,再入栈,两者的区别在于前者在第三种情况计算时会多计算一次(会多进行一次面积计算结果为0的计算),但最后的结果 res 不变(因为 res 是所有面积中的最大值)。大体思路:对于每一个柱子,我们需要找到这根柱子左边 向左第一根柱子高度小于当前柱子高度的柱子的下标,和右边向右第一根柱子高度小于当前柱子高度的柱子下标,如下图,然后计算由当前柱子为基础所能形成的柱子的最大面积。

2024-05-30 19:38:49 469 1

原创 LeetCode 79.单词搜索

对于 word 字符串,每匹配到一个字符 word.charAt(p) 后(假设在 board[ i ][ j ] 处匹配到),就递归匹配下一个字符 word.charAt(p+1)(在 board[ i ][ j + 1]、board[ i ][ j - 1]、board[ i +1 ][ j ]、board[ i +1 ][ j ] 处去尝试匹配),如此类推。同时注意到对已经匹配的字符需要加一个标识,避免其被再次匹配到(可以给已经匹配的字符加一个 - 号,让其不能再和word 中的字符匹配到)。

2024-05-23 17:14:08 545

原创 LeetCode 22.括号生成

本题可以采用 回溯的方法解决。将剩余可放置的 左括号 '(' 数量 left 和 右括号 ')' 数量 right 作为参数传入 backtrack 函数中。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。

2024-05-23 16:22:11 511

原创 652. 寻找重复的子树

对于第二个问题,可以通过一个 HashMap 来去重。当一个结构出现第二次的时候,将这个结构所在的根节点加入到 结果集中,这个结构出现更多次的时候不能重复添加。对于第一个问题,可以通过序列化表示出当前子树的结构。对于每一个节点,利用一个序列化字符串标识其结构,可以通过 前序、中序、后序或者层序遍历,本文采用后序遍历。本题需要找到重复的子树,那么需要解决两个问题。一、如何知道 以当前节点为根节点的子树的结构。二、如何知道以当前节点为根节点的子树 是否重复出现过。对于同一类的重复子树,你只需要返回其中任意。

2024-05-13 16:10:30 424

原创 124. 二叉树中的最大路径和

对于每个节点,以这个节点为根节点的路径最大和 为 该节点的节点值 + 左右子节点的最大贡献值。所以只需要遍历整棵二叉树,对于每一个节点:1.计算其最大贡献值 并返回2.计算以该节点为根节点的最大路径和 curSum 并更新全局最大路径和 maxSum。2.节点为叶子节点,则其最大贡献值为叶子节点的节点值。(节点不为叶子节点,最大贡献值为节点值 + 左右子节点中贡献值较大者。被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。1.节点为空,其最大贡献值为0。节点,且不一定经过根节点。

2024-05-12 15:39:53 409 1

原创 LeetCode 238. 除自身以外数组的乘积

本题可采用 取每个元素 nums[ i ]之前所有的元素 的乘积 pre[ i ]和 每个元素之后所有元素的乘积 behind[ i ] 做乘积的方法,得出 res[ i ]。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。

2024-05-02 19:50:25 330 1

原创 LeetCode 647. 回文子串

当 s.charAt( i ) == s.charAt( j ) 时,此时 分为三种情况:一: i==j,这时说明 i 和 j 指向的是同一个字符 a,可以算作回文子字符串,因此 dp[ i ][ j ] = true;三:j - i >= 2 ,这时候需要判断 i+1 到 j-1 是否为回文子字符串,即 dp[ i+1 ][ j-1 ] 是否为 true,如果为 true,则说明 i ~ j 也是回文子字符串,即 dp[ i ][ j ] = true。三个回文子串: "a", "b", "c"

2024-04-19 19:10:03 530 1

原创 LeetCode 121. 买卖股票的最佳时机

买入这只股票,因此在购入股票的那一天 的金额 dp[ i ][ 0 ] 肯定为 -prices[ i ] ,而不是 dp[ i -1 ][ 1 ] - prices[ i ],因为 dp[ i -1 ][ 1 ] - prices[ i ] 中的 dp[ i -1 ][ 1 ] 包含了 在 i -1 天之前买入股票又卖掉的情况。用 dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);

2024-04-16 00:07:16 1044

原创 LeetCode 337. 打家劫舍 III

动态规划的 dp 数组可以仅是一个 int [ ] 数组,为每一个节点创建一个这样的 dp 数组(通过递归创建)。数组里面只有两个值,dp [ 0 ] 表示偷当前节点所能获得的最高金额,dp [ 1 ] 表示不偷当前节点所能获得的最高金额。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。最后 获取根节点的 状态数组 res,然后返回 res 数组中的最大值即可。小偷又发现了一个新的可行窃的地区。小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7。,小偷能够盗取的最高金额。

2024-04-14 17:29:32 873

原创 LeetCode 213. 打家劫舍 II

但本题需要注意 1 号房子和 len(nums 的长度) 号房子不能同时偷窃。因此可以分两种情况考虑,一是只考虑 从 1 号房子到 len -1 号房子中所能偷窃的最大值 ,二是只考虑从 2 号房子到 len 号房子所能偷窃的最大值。你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。,今晚能够偷窃到的最高金额。

2024-04-11 17:39:00 253

原创 LeetCode 198.打家劫舍

一是偷 i 号房,这样就要求 i - 1 号房没被偷,所以 dp[ i ] 可以等于 dp[ i - 2 ] + value[ i ];二是 不偷 i 号房,则 从 1 到 i 号房所能偷的最大价值 dp[ i ] 等于 从 1 到 i - 1 号房所能偷的最大价值 dp[ i - 1 ]。因此 dp[ i ] = Math.max(dp[ i - 2 ] + value[ i ],dp[ i - 1 ])。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

2024-04-11 17:29:24 468

原创 LeetCode 139. 单词拆分

递推公式:dp[ i ] 为 true,当且仅当 [ j,i ) 的子字符串能由 字典里面的字符串组成且 dp[ j ] 为 true。本题可以视作一个完全背包问题,单词的长度 s 为背包的容量,字典里面的各个字符串为 物品。采用动态规划来解决。dp[ i ] 为 true 则表示长度为 i 的字符串能由字典里面的字符串组成。返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

2024-04-10 19:55:16 412

原创 LeetCode 322. 零钱兑换

如果对于一个容量 j 来说,在遍历完了所有的物品(硬币)后,发现没有物品(硬币)能装进容量为 j 的背包,则 dp[ j ] 此时仍为 Integer.MAX_VALUE,这说明 容量为 j 的背包是没有硬币组合能装满的。在这种情况下,dp[ j ] 不能作为 容量大于 j 的的 dp 值的前置条件,即如果有 一个 容量大于 j 且需要 dp[ j ] 作为前置条件的 dp 值的话,那么这个 dp 值所对应的容量的背包也是不能被装满的,即没有任何一种硬币组合能组成总金额。遍历顺序:本题是求硬币的组合数。

2024-04-09 17:10:13 484

原创 KamaCoder 57. 爬楼梯(第八期模拟笔试)

初始化:dp[ 0 ] = 1,其余 dp 值初始化为 0。本题可以看作一个完全背包问题,n 为要爬的阶梯数(背包的容量),m表示每次爬楼梯时 可以走 1 ~ m 阶,则 问需要爬 n 阶楼梯,每次只能爬 1~m 阶,有多少种方法,等同于用重量为 1~m 的物品 要装满容量为 n 的背包,同一物品可重复添加,有多少种方法。遍历顺序:本题是要求装满背包的排列数,比如走 三阶楼梯,先走一阶再走两阶 或者先走两阶都可以,因此遍历顺序是先遍历背包容量(要走的阶梯数),再遍历物品(每次走的步数)。

2024-04-09 16:14:15 313

原创 LeetCode 518. 零钱兑换 II

如果 容量为 j 的背包装入了 大小为 coins[ i ] 的物品,那么就变成了一个 容量为 j - coins[ i ] 的背包,那么 dp[ j ] 就应该加上 dp[ j - coins[ i ]]。故 dp[ j ] += dp[ j - coins[ i ] ]本题是完全背包问题,即 数字可以无限次装入背包,求背包的最大价值的问题。dp[ j ] :要装满容量为 j 的背包有 dp[ j ] 种方法。初始化:将 dp[ 0 ] 初始化为 1,其余 dp 值初始化为 0。

2024-04-08 16:26:42 501

原创 KamaCoder 52. 携带研究材料(第七期模拟笔试)

容量为 j 的背包的最大价值有两个来源,一是 装进了物品 i,价值为未加入物品 i 前背包的最大价值 + 物品 i 的价值。本题是一个 完全背包问题,给定一个有最大容量的背包和一些物品(有重量和价值),物品可以重复添加进背包里面,求背包的最大价值。初始化:dp[ 0 ] 显然为 0,其余 dp 值也初始化为 0,避免 初始值过大而覆盖 计算出来的值。小明的行李箱所能承担的总重量为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。输出一个整数,表示最大价值。

2024-04-08 15:33:21 297

原创 LeetCode 474. 一和零

dp[ i ][ j ] 有两个来源,一是 物品(字符串)没有放进背包里面,那么 dp[ i ][ j ] 不变。二是 物品(字符串)放入了背包,则dp[ i ][ j ] = dp[ i - x ][ j - y ] + 1 ,背包的里面 0 和 1 的剩下的容量要减少,背包中装的物品的个数 +1。其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。

2024-04-07 21:11:10 443

原创 LeetCode 494. 目标和

递推公式:dp[ j ] = dp[ j - nums[ i ] ],遍历数字 nums[ i ],将 nums[ i ] 装进背包,看剩下的空间要装满有多少种方法 a,将 a 添加到 dp[ j ]中,然后遍历下一个数字。解释: 当容量为 j 的背包被占用了 nums[ i ] 的空间时,还剩下 容量为 j - nums[ i ] 的空间,而要装满这剩下的 j - nums[ i ] 的空间有 dp[ j - nums[ i ] ] 种方法。遍历顺序是:先遍历物品(即数字),再遍历背包容量。

2024-04-07 16:47:26 830

原创 LeetCode 1049. 最后一块石头的重量 II

关键在于想到将这堆石头划分成两堆总重量相等或最相近的石头,然后再对这两堆石头做差取绝对值就可以得到最后的结果了。石头的重量也是石头的价值。无论 dp[ target ] 最后的值为多少,dp[ target ] 与 sum - dp[ target ] 的差值是将 stones 这堆石头划分成两堆后最小的。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],

2024-04-06 17:23:24 328

原创 LeetCode 416. 分割等和子集

往背包里面添加元素,每个元素的重量为 nums[ i ],每个元素的价值为 nums[ i ],当容量为 target 的背包里面的 最大价值 dp[ target ]为 target 时,说明能将一些元素装进一个背包里面,使得这些元素的 和为 sum 的一半,则说明必然可以将 nums 数组分为两个 和相等的子集。注意要先遍历 物品 i,再遍历背包容量 j,否则会导致 对于每个容量为 j 的背包,里面的最大价值是 物品 i 中 重量小于 j 的那一个物品的价值,即这时背包里面只能装一个元素。

2024-04-06 16:19:23 417

原创 KamaCoder 46. 携带研究材料(第六期模拟笔试)

初始化:当容量 j = 0 时 dp[ i ][ 0 ] 肯定为 0;当 i = 0,即只将 0 号物品装入 背包时,如果背包的容量 j < weight [ 0 ],则此时装不进背包,背包中的价值为 0,当 背包的容量 j >= weight[ 0] 时,这时可以将 0 号物品装入背包,背包的价值为 value[ 0 ]。故 dp[ i ][ j ] = Math.max(dp [ i -1 ][ j ] ,dp[ i-1 ][ j - weight [ i ] ] + value[ i ]);

2024-04-04 17:31:26 480

空空如也

空空如也

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

TA关注的人

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