自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetCode337. 打家劫舍 III(二叉树)

在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ ...

2021-11-02 22:29:12 260

原创 leetCode 213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为.

2021-11-01 09:52:06 206

原创 leetCode 198. 打家劫舍I

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:...

2021-11-01 09:50:36 200

原创 leetCode 714. 买卖股票的最佳时机含手续费

给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;整数fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入:prices = [1, 3, 2, 8, 4, 9], fee = 2输出:8解释:能够达到的最大利润: 在此处买入p...

2021-10-18 21:07:54 120

原创 leetcode 309 最佳买卖股票时机含冷冻期

给定一个整数数组,其中第i个元素代表了第i天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]来源:力扣(LeetCode)链接:https://leetcode-cn.c...

2021-10-18 20:09:19 69

原创 leetCode 188 买卖股票的最佳时机 IV(k=任意正整数)

给定一个整数数组prices ,它的第 i 个元素prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:k = 2, prices = [2,4,1]输出:2解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。示例 2:输入:k ..

2021-10-14 20:01:14 80

原创 123. 买卖股票的最佳时机 III(k=2)

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例1:输入:prices = [3,3,5,0,0,3,1,4]输出:6解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天...

2021-10-13 22:10:16 85

原创 leetCode 122 买卖股票的最佳时机 II(k=+∞,正无穷)

给定一个数组 prices ,其中prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: prices = [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(...

2021-10-13 11:21:23 73

原创 leetCode 121买卖股票的最佳时机(k=1)

给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利...

2021-10-13 10:40:36 53

原创 leetCode 3 无重复字符的最长子串(滑动窗口)

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pw...

2021-10-12 15:43:29 53

原创 leetCode 438 找到字符串中所有字母异位词

给定两个字符串s和 p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。示例1:输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。示例 2:输入: s = "abab", p = "ab"输出: [0...

2021-10-12 15:05:10 91

原创 leetCode 76 最小覆盖子串(滑动窗口)

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"示例 2:输入:s = "a", t = "a"输出:"a"示例 3:输入: s = "a",

2021-10-11 22:49:51 147

原创 leetCode 567 字符串的排列(滑动窗口)

给你两个字符串s1和s2 ,写一个函数来判断 s2 是否包含 s1的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的 子串 。示例 1:输入:s1 = "ab" s2 = "eidbaooo"输出:true解释:s2 包含 s1 的排列之一 ("ba").示例 2:输入:s1= "ab" s2 = "eidboaoo"输出:false来源:力扣(LeetCode)链接:https://leetcode-cn.com/pro...

2021-10-11 18:04:56 76

原创 Leetcode 752. 打开转盘锁(BFS)

你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为'0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以解锁的数字.

2021-09-08 22:58:17 136

原创 LeetCode 111 求二叉树最小深度

给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree思路:

2021-08-25 23:47:56 103

原创 BFS广度优先算法框架

BFS的核心思想,就是把一些问题抽象成图,从一个点开始向四周扩散。一般来说,我们写BFS算法都是用队列这种数据结构,每次将一个节点周围的所有节点加入队列。BFS相对DFS最主要区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度比DFS大很多。BFS出现的常见场景,问题的本质就是在一幅图中找到起点start到终点target的最近距离。记住下面这个框架就ok了://计算从起点start到终点target的最近距离int BFS(Node start,Node target){

2021-08-25 00:00:42 228

原创 LeetCode 51 N 皇后

n皇后问题 研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的n皇后问题 的解决方案。每一种解法包含一个不同的n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。示例 1:输入:n = 4输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]解释:如上图所示,4 皇后问题存在两个不同的解法。示例 2:输入:...

2021-07-27 20:37:23 149

原创 求一个数组的全部排列组合

给定一个数组,元素不重复,返回它的所有排列组合。例如输入:[1,2,3]返回[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]解题思路:通过回溯,穷举的方式获取全排列组合/** * 给定一个不重复元素的数组,返回它的全排列 */public class TestFull { public List<List<Integer>> arrFullList(int[] nums) { Lis

2021-07-27 17:37:10 1632

原创 LeetCode 322 零钱兑换(coinChange)

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1 。你可以认为每种硬币的数量是无限的。示例1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount ...

2021-07-20 20:56:59 354

原创 LeetCode 509 斐波那契数(Fibonacci)

斐波那契数,通常用F(n) 表示,形成的序列称为 斐波那契数列 。该数列由0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fibonacci-numberpublic class Fibonacci { /** ...

2021-07-19 23:21:41 154

原创 LeetCode 99 恢复二叉搜索树

给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?示例 1:输入:root = [1,3,null,null,2]输出:[3,1,null,null,2]解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。示例 2:输入:root = [3,1,4,null,null,2]输出:[2,1,4,nul

2021-07-15 17:24:45 68

原创 LeetCode 106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder =[9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-po...

2021-07-10 22:26:54 272 2

原创 LeetCode 105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder =[3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-i.

2021-07-10 20:31:08 70

原创 LeetCode 124题 求二叉树中最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。示例

2021-07-10 19:54:15 102

原创 数据结构和算法的框架思维

从整体到细节,自顶向下,从抽象到具体的框架思维都是通用的,不只是学习数据结构和算法,学习其他知识都是高效的。1.数据结构的存储方式数据结构的存储方式只有两种,数组(顺序存储)和链表(链式存储)。散列表,栈,队列,堆,树,图等等都是“上层建筑”,而数组和链表才是“基础结构”。比如:队列,栈,这两种数据结构既可以用数组,也可以用链表来实现。用数组实现就要处理扩容,缩容的问题;用链表实现,就没有这个问题,但是需要更多的内存空间存储节点指针。图,的两种表示方法,邻接表就是链表,邻接矩阵就是二维数

2021-07-10 17:39:31 176 1

原创 Netty:Channel和Unsafe

1.Channel的功能介绍1.1 成员变量定义/** * A skeletal {@link Channel} implementation. */public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { private static final InternalLogger logger = InternalLoggerFactory.getIns

2021-07-08 22:00:16 132 1

原创 RocketMQ 事务消息

RocketMQ 官方发布了 4.3.0 版本,此版本解决了 RocketMQ 对事务的支持,这一重大更新对 RocketMQ 至关重要 。 本章将基于 RocketMQ 官方最新 4.3.0 版本,对其事务消息的实现原理进行深入探讨。 主要内容如下 。·事务消息实现思想·事务消息发送流程·事务消息提交或回滚·事务消息回查事务状态1 事务消息实现思想RocketMQ 事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚,交互设计如图 8-1 所示 。1 )应用程序在事

2021-02-13 22:24:12 373

原创 RocketMQ 主从同步( HA)机制

高可用特性是目前分布式系统中必备的特性之一,对一个中 间件来说没有 HA 机制是一个重大的缺陷,本章将主要分析 RocketMQ 主从同步( HA ) 机制 。本章重点内容如下 。•主从同步复制实现原理 。• RocketMQ 读写分离机制 。1.RocketMQ 主从复制原理为了提高消息消费的高可用性,避免 Broker 发生单点故障引起存储在 Broker 上的消息无法及时消 费, RocketMQ 引 入了 Broker 主备机制 , 即消息消费到达主服务器后需要将消息同步到消息从服.

2021-02-13 21:44:34 1356

原创 RocketMQ消息过滤 FilterServer

在消息消费的时候,我们会考虑到各种情况,并不是所有消息都需要进行消费的,需要查询出包含特殊标志的消息进行消费,而本章主要分析 RocketMQ 基于类模式的消息过滤机制,主要内容如下 。• ClassFilter 运行机制• FilterClass 订阅信息注册• FilterServer 注册剖析·消息拉取(拉模式)1 ClassFilter 运行机制基于类模式过滤是指在 Broker 端运行 1 个或多个消息过滤服务器( FilterServer ),RocketMQ 允许消息消费者自定义消

2021-02-13 20:30:30 744

原创 RocketMQ 消息消费

本章主要分析 RocketMQ 如何消费消息,重点剖析消息消费的过程中需要解决的问题 。·消息队列负载与重新分布·消息消费模式·消息拉取方式·消息进度反馈·消息过滤·顺序消息1 RocketMQ 消息消费概述消息消费以组的模式开展, 一个消费组内可以包含多个消费者,每一个消费组可订阅多个主题,消费组之间有集群模式与广播模式两种消费模式 。 集群模式,主题下的同一条消息只允许被其中一个消费者消费 。 广播模式,主题下的同一条消息将被集群内的所有消费者消费一次。 消息服务器与消费者之间的消息传送

2021-02-13 18:03:17 1545

原创 RocketMQ 消息存储

目前的 MQ 中间件从存储模型来看 ,分为需要持久化和不需要持久化的两种模型,现在大多数的 MQ 都是支持持久化存储的,比如 ActiveMQ 、 RabbitMQ 、 Kafka,RocketMQ ,而 ZeroMQ 却不需要支持持久化存储 。 然而业务系统也大多需要 MQ 有持久存储的能力 ,能大大增加系统的高可用性 。 从存储方式和效率来看,文件系统高于 KV 存储, KV 存储又高于关系型数据库,直接操作文件系统肯定是最快的,但可靠性却是最低的,而关系型数据库的性能和可靠性与文件系统恰恰相反,第 4

2021-02-12 16:13:56 424

原创 RocketMQ 消息发送

RocketMQ 发送普通消息有 三 种实现方式:可靠同步发送 、 可靠异步发送 、 单向(Oneway)发送 。 第 3 章主要聚焦在 RocketMQ 如何发送消息,然后从消息的数据结构开始,逐步介绍生产者的启动流程和消息发送的流程,最后再详细阐述批量消息发送 。本章重点内容如下 。• RocketMQ 消息结构·消息生产者(Producer)启动流程·消息发送过程·批量消息发送1 漫谈 RocketMQ 消息发送RocketMQ 支持 3 种消息发送方式 :同 步(sync ) 、 异步

2021-02-11 20:18:22 654

原创 RocketMQ 路由中心 NameServer

本章主要介绍 RocketMQ 路由管理 、 服务注册及服务发现的机制, NameServer 是整个RocketMQ 的“大脑” 。本章重点内容如下 。• NameServer 整体架构设计• NameServer 动态路由发现与剔除机制2.1 NameServer 架构设计消息中间件的设计思路一般基于主题的订阅发布机制 消息生产者( Producer)发送某一 主题的消息到消息服务器,消息服务器负责该消息的持久化存储,消息消费者(Consumer)订阅感兴趣的主题,消息服务器根据订阅信息(路由

2021-02-11 12:36:49 186

原创 RocketMQ简介

1.RocketMQ 的设计理念和目标RocketMQ 设计基于主题的发布与 订阅 模式 , 其核 心功能包括消息 发送、 消息存储( Broker )、消息消费,整体设计追求简单与性能第一,主要体现在如下三个方面 。首先, NameServer 设计极其简单,摒弃了业界常用的使用 Zookeeper 充 当信息管理的 “注册中心”,而是自研 NameServer 来实现元数据 的管理( Top ic 路由信息等 ) 。 从实际需求出发,因为 Topic 路由信息无须在集群之间保持强一致,追求最终一致

2021-02-11 10:50:57 240 1

原创 Dubbo过滤器

本章主要内容:•Dubbo过滤器概述;• 过滤器链初始化的实现原理;• 服务提供者过滤器的实现;• 消费者过滤器的实现。1 Dubbo过滤器概述做过Java Web开发的读者对过滤器应该都不会陌生,Dubbo中的过滤器和Web应用中的过滤器的概念是一样的, 提供了在服务调用前后插入自定义逻辑的途径。 过滤器是整个Dubbo框架中非常重要的组成部分, Dubbo中有很多功能都是基于过滤器扩展而来的。 过滤器提供了服务提供者和消费者调用过程的拦截, 即每次执行RPC调用的时候, 对应的过滤器都会.

2021-02-02 15:45:15 289

原创 Dubbo高级特性

本章主要内容:• Dubbo高级特性概述;• Dubbo高级特性原理。2服务分组和版本Dubbo中提供的服务分组和版本是强隔离的, 如果服务指定了服务分组和版本, 则消费方调用也必须传递相同的分组名称和版本名称。<dubbo:service interface="com.alibaba.pay.order.QueryService"class="com.alibaba.pay.order.StableQueryService" version="1.0.0-stable"/>

2021-02-02 10:08:59 240

原创 Dubbo扩展点

本章主要内容:• 核心扩展点概述;• RPC层扩展点;• Remote层扩展点;• 其他扩展点。

2021-02-01 23:03:13 208

原创 Dubbo集群容错

本章主要内容:• 集群容错总体实现;• 普通容错策略的实现;• Directory的实现原理;• Router的实现原理;• LoadBalance的实现原理;

2021-02-01 17:52:37 203

原创 Dubbo 远程调用

本章主要内容:• Dubbo核心调用流程;• Dubbo协议详解;• Dubbo编解码器原理;• Telnet调用原理;• Dubbo线程模型。1 Dubbo调用介绍在讲解Dubbo中的RPC调用细节之前, 我们先回顾一次调用过程经历了哪些处理步骤。如果我们动手写简单的RPC调用, 则需要把服务调用信息传递到服务端, 每次服务调用的一些公用的信息包括服务调用接口、 方法名、 方法参数类型和方法参数值等, 在传递方法参数值时需要先序列化对象并经过网络传输到服务端, 在服务端需要按照客户端序列化顺

2021-01-31 15:11:41 986 4

原创 Dubbo启停原理解析

本章主要内容:• Dubbo配置解析;• Dubbo服务暴露原理;• Dubbo服务消费原理;• Dubbo优雅停机解析1配置解析目前Dubbo框架同时提供了 3种配置方式:XML配置、 注解、 属性文件(properties和ymal)配置, 最常用的还是XML和注解两种方式。1.1 基于schema设计解析Dubbo 设计之初也考虑到属性最大限度的复用, 因此对schema进行了精心的设计, Dubbo schema层级的详细设计如图5.1所示。1.2 基于XML配置原理解析

2021-01-31 13:22:47 262 1

空空如也

空空如也

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

TA关注的人

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