自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 有关数组的经典算法题

下面给出10道高频数组经典算法题,覆盖双指针、滑动窗口、前缀和、排序、原地操作、二分查找等主流解法,每题附带题意、思路、完整Java代码,适合刷题复盘。升序数组numbers,找出两个下标(从1开始)使得两数相加等于target,唯一解。正整数数组,找出连续子数组和 ≥ target 的最小长度,不存在返回0。原地删除数组中值等于val的元素,返回新数组长度,不能使用额外数组。升序排列数组,原地删除重复元素,每个元素只保留一次,返回新长度。例题4:两数之和(有序数组,对撞双指针)将数组向右轮转k个位置。

2026-06-13 18:21:15 205

原创 有关栈的经典算法题

k[encoded_string],把括号内字符串重复k次,支持嵌套,例如3[a2[bc]]→abcbcabcbcabcbc。覆盖基础栈、单调栈、辅助栈、括号匹配、表达式求值、栈模拟队列、区间最值等面试高频题型,每题包含题意、思路、完整代码。栈核心特性:后进先出LIFO,常用场景:括号校验、递归转迭代、单调性维护、临时缓存。遇右括号,栈顶匹配则出栈,不匹配直接false;设计栈,支持push、pop、top,额外O(1)获取栈中最小元素。栈顶和当前字符相等则出栈,否则入栈,最后拼接栈内字符。

2026-06-13 18:21:01 315

原创 有关字符串的经典算法题

下面整理10道高频字符串算法例题,覆盖双指针、滑动窗口、哈希统计、KMP、字符串模拟、反转、子串、回文、异位词等经典题型,每题含题意、解题思路 + Java完整代码,面试高频原题。输入 “hello world”,输出 “world hello”,去掉首尾多余空格、单词间只保留单个空格。例题6:实现strStr() / 查找第一个匹配子串(朴素匹配)s、t两个字符串,判断是否字母组成完全相同,仅排列顺序不同。例题5:字符串中的单词反转(整体翻转+局部翻转)例题3:无重复字符的最长子串(滑动窗口)

2026-06-13 18:20:35 203

原创 动态规划算法详细讲解

/ dp[i][0]无操作 dp[i][1]第一次持有 dp[i][2]第一次卖出 dp[i][3]第二次持有 dp[i][4]第二次卖出。背包容量V,n个物品,每个物品重量w[i]、价值v[i],每件只能拿1次,求最大总价值。• 转移:dp[i] = min(dp[i-coins[j]]+1)dp[i][j]:第i天,j状态(无股/持有1股/已卖1次)最大收益。定义dp数组含义:dp[i] / dp[i][j] 代表什么状态。• 转移:dp[i] = dp[i-1] + dp[i-2]

2026-06-12 11:04:32 473

原创 分治算法详细讲解

核心思想:分(拆成子问题)→治(递归求解子问题)→合(合并子结果),适合大规模问题拆解,高频场景:排序、查找、统计、矩阵、最近点对等。选基准值划分区间,小元素放左、大元素放右,再递归左右子区间。治:递归求左右最小距离d1、d2,d=min(d1,d2);计算 x^n,不用循环连乘,二分拆分指数降低时间复杂度。升序数组,查找目标值target下标,不存在返回-1。拆分左右,分别统计内部逆序对,合并时统计跨区间逆序对。不断折半拆分搜索区间,只在单侧子区间递归查找。数组对半拆分,分别求左右最大值,合并取更大值。

2026-06-12 11:00:48 183

原创 贪心算法详细讲解

覆盖区间调度、跳跃游戏、零钱、分发糖果、最优买卖股票、区间合并等面试高频题型,难度由入门到中等,每道题明确贪心选择策略(贪心核心:局部最优→全局最优)。二维数组intervals,每个区间[start, end],求最少移除多少区间,剩余区间互不重叠。孩子胃口数组g,饼干尺寸数组s。沿路加油站数组,每个站油量,油箱无限容量,初始油量足够开到第一站,求最少加油次数。按区间起点排序,逐个遍历,能合并就更新右端点,不能合并直接存入结果。遍历区间,到达上一轮最远边界时触发一次跳跃,更新新的最远可达位置。

2026-06-12 10:56:45 192

原创 滑动窗口算法详细讲解

下面一次性给出 滑动窗口10道经典例题,分定长窗口、不定长(最小/最大长度)、字符哈希窗口三大类,每道包含题意、思路、完整Java代码,可直接运行。字符串s,固定窗口长度k,统计每个窗口内元音(a,e,i,o,u)最大个数。给定数组nums和固定长度k,求长度为k的连续子数组最大累加和。字符串,可把任意k个字符替换成别的,求最长重复连续子串长度。二进制数组,最多把1个0翻成1,求最长连续1子数组长度。数组nums,窗口大小k,返回每个滑动窗口内最大值数组。字符串s,最多包含k种不同字符,求最长子串长度。

2026-06-12 10:53:31 403

原创 双指针算法详细讲解

升序数组numbers,目标值target,返回两个下标(从1开始),两数相加=target,唯一解。覆盖快慢指针、左右对撞指针、滑动窗口三类高频双指针场景,难度从入门到中等,面试常用。正整数数组nums,目标s,找连续子数组和≥s的最小长度,无则返回0。原地移除数组中等于val的元素,返回新长度,不能新开数组。升序数组原地删除重复元素,每个元素只保留1次,返回新长度。快慢指针:同起点,一快一慢同向走(链表判环、数组去重)左右指针(对撞):有序数组,左从头、右从尾相向移动。例题2:移除元素(同向快慢指针)

2026-06-12 10:49:34 352

原创 binlog/redolog/undolog三者对比

落盘规则 循环覆写(ib_logfile固定大小) 事务提交不立即删,purge后台回收 追加写入,永久留存,可配置过期删除。日志内容 物理日志:修改的数据页内容 逻辑日志:反向SQL(原值) 逻辑日志:完整执行SQL/DML。事务关系 所有DML都会生成 DML生成,DDL很少 提交才写入,失败回滚不生成。innodb之外引擎没有redo/undo,全靠binlog记录数据变更。binlog:主从同步、归档、Server层、逻辑SQL,数据备份。undo:事务回滚+MVCC、引擎层、逻辑,保证原子性。

2026-06-04 15:33:10 178

原创 分布式锁三种实现

• 解锁:必须校验value再DEL(避免删别人的锁),用Lua脚本原子解锁。看门狗自动续期:业务没执行完,定时续过期时间,防止业务没做完锁过期。可重入:原生Redis不支持,Redisson内部计数实现可重入。事务内锁定行,其他事务阻塞,依赖数据库行锁;一、基于Redis分布式锁(项目最常用,Redisson)// 尝试加锁,等待10s,持有30s自动过期。• 缺点:性能差,zk频繁创建节点,高并发不用。释放:断开连接临时节点自动删除,天然防死锁。• 优点:可靠性高、可重入、自动释放。

2026-06-04 15:28:13 171

原创 分布式事务4种主流方案

• 执行业务SQL,记录undo_log回滚日志,锁定行,提交本地事务,释放锁,提交成功;本地消息表:本地库新建msg_log表,业务和落库同事务,定时任务轮询补发消息。二阶段回滚:用undo_log生成补偿SQL回滚数据,删undo_log。事务消息MQ:RocketMQ原生事务消息,半消息→本地事务→确认投递。• Cancel:失败回滚,释放冻结资源(任一失败全部Cancel)优点:无侵入、代码改动少|缺点:占用行锁,高并发一般。优点:异步、高并发、性能最好|缺点:最终一致,非实时。

2026-06-04 15:25:11 231

原创 Redis四大经典缓存问题

布隆过滤器 BloomFilter:所有合法key预加载过滤器,不存在直接返回,不查Redis、DB。互斥锁(Redisson分布式锁):缓存失效时,只有一个线程查DB+写缓存,其余等待重试。查询数据库没有的数据,缓存无key → 每次都查DB,DB压力暴增(恶意空参攻击)。缓存空值:DB查不到,Redis存入key:null,过期短时间(5min)永不过期(逻辑过期):key不设expire,单独起异步线程定时刷新缓存。二、缓存击穿:热点key过期瞬间,大量请求打DB。

2026-06-04 15:18:52 301

原创 SpringBoot自动装配原理

核心一句话:依托@EnableAutoConfiguration + SPI + 条件注解,按需自动创建Bean,替代XML配置一、入口:@SpringBootApplication@EnableAutoConfiguration是自动装配开关@EnableAutoConfiguration底层AutoConfigurationImportSelector是自动装配核心类。二、核心流程(3步)从 META-INF/spring.factories 中读取全路径自动配置类列表。

2026-06-04 15:14:01 166

原创 线程死锁的解决方案

死锁源于互斥、请求保持、不可剥夺、循环等待四大条件,工程上最常用:统一加锁顺序 + 锁超时 + 减少锁嵌套,再配合监控兜底。获取锁时设置超时时间,超时没拿到就主动释放已持有锁,重试或放弃。线程申请新锁失败时,立刻释放当前已持有的所有锁,再重新尝试。当线程持有资源又申请不到新资源时,系统强行收回已持有的资源。请求并保持:线程持有旧资源,又去申请新资源,不释放已有资源。• 示例:存在锁A、锁B,所有线程一律先拿A,再拿B。// 线程2:先锁B,再锁A → 循环等待,死锁。

2026-05-29 15:06:31 300

原创 Redis为什么快?

Redis 跑得快,主要因为:全内存存储 + 单线程无锁竞争 + IO多路复用高并发连接 + 高效数据结构 + 轻量化网络协议。多线程会引入锁、竞争、上下文切换,反而降低性能,且Redis本身单线程足以扛住海量QPS。注意:Redis 6.0+ 引入多线程IO,仅负责网络读写,命令执行依旧单线程。SDS 字符串规避C语言字符串缺陷,预分配内存、惰性释放,减少频繁内存分配。内存分配器(jemalloc)优化内存管理,降低碎片,提升访问效率。仅把网络读写、协议解析交给多线程,命令执行依旧单线程,保证线程安全。

2026-05-29 15:00:19 54

原创 Redis核心数据结构以及应用场景

Redis 常用8 种数据结构:String、List、Hash、Set、ZSet、Geo、Bitmap、HyperLogLog,附带底层、用法、典型场景。lpush / rpush / lpop / rpop / lrange / brpop(阻塞弹出)基数统计,概率算法,有误差(0.81%),极小内存统计海量去重数量。• 单纯缓存、计数器、分布式锁、限流 → String。跳表范围查询、排序、区间遍历更优,实现简单,内存友好。• 去重、交集并集、好友、标签、抽奖 → Set。

2026-05-29 14:57:53 214

原创 Kafka如何避免重复消费

一、重复消费的根本原因核心:offset 提交时机 和 消息处理完成 不同步自动提交 offset(默认)消费者定时自动提交位移,还没处理完消息就提交了。若此时消费者宕机/重启,会从上一次已提交 offset 之后重新拉取,造成重复。手动提交 offset 失败/超时业务逻辑执行成功,但网络问题、客户端异常导致 offset 提交失败,重启后重消费。消费者再均衡(Rebalance)组内上下线、分区重分配,未提交 offset 的分区会被其他消费者接管,重新消费。生产者重试。

2026-05-29 14:48:02 505

原创 Kafka保证消息顺序性

Kafka 默认只保证分区内消息有序,分区之间无序,所有顺序方案都围绕分区设计。消费者:同一个分区只能被消费者组内一个消费者消费,天然保证分区内消费有序。业务维度有序、高并发:多分区 + 业务Key分区 + 分区单线程消费。• 把需要有序的同一类消息设置相同 key,会被路由到同一个分区。结论:同订单/同用户消息有序,不同业务互不干扰,兼顾顺序与并发。一个分区绑定一个消费线程,禁止多线程并发处理同一分区消息。// 同一订单所有消息用同一个 key,保证进同一分区。缺点:并发低,吞吐量受限。

2026-05-29 14:45:20 311

原创 2026华为OD机考真题附答案-分辨率排序

分辨率(宽x高)匹配清晰度的规则:给定任意宽分辨率(宽x高),宽和高同时都大于等于清晰度的宽、高定义时,才认为满足该。3.简化逻辑:不考虑交换宽高的情况,例如 2500x3200,匹配为 1080P,不能匹配为 2K。·2500x3200 不考虑宽高交换,宽 2500< 2560,所以不算 2K,满足1080P。2.最大清晰度为 4K,即只要满足 4K 清晰度标准的宽、高,无论多大,都归为 4K。清晰度大小定义:720P < 1080P < 2K< 4K。排序时先比清晰度,再比面积,再比宽,所以结果如上。

2026-05-28 10:40:20 540

原创 Java经典算法题-无重复字符的最长子串

【代码】Java经典算法题-无重复字符的最长子串。

2026-05-28 09:46:25 186

原创 2026华为OD机考真题附答案-准备生日礼物

3.日期录入格式统一采用Year/Month/Day,Year 长度为4,Month和Day长度为1到2,系统保证录入。小明在一个充满人文关怀的公司上班,公司每个月都要为该月生日的同事送一份生日小礼物,该事项由小明负责,请帮助小明统计。某一月份应该准备多少礼物,重复录入的员工生日以最后一次录入结果为准,请不要重复统计,避免浪费。参数3,员工生日日期列表,该列表和员工列表中的数据对应存在一一对应关系,长度一致。在5 月份出生的员工有 3人,因此返回为 3。参数1,要发放礼物的月份,取值1到12。

2026-05-27 15:33:03 132

原创 2026华为OD机考真题附答案-计算数列位置N的值

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元。素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、 输入M、N两个数,则按照以下规则形成一个数列;public class 计算数列位置N的值 {2、 数列的前M个元素的值为1到M;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

2026-05-27 15:02:22 254 1

原创 Mybatis完整执行流程

加载主配置 + Mapper.xml,解析封装成 Configuration 全局配置对象。◦ Executor:执行器(默认Simple/批量Batch/可复用Reuse)getMapper(接口.class) → JDK动态代理,不用写实现类。• 动态代理:Mapper接口无实现类,MyBatis自动生成代理。• SqlSession:一次数据库会话,线程不安全,用完即关。◦ StatementHandler:预处理SQL、设置参数。• SqlSessionFactory:单例,全局只创建一个。

2026-05-22 10:09:43 42

原创 MySQL索引失效10大经典场景

当查询结果超过全表 20%~30% 时,MySQL 认为走索引+回表不如全表扫描快,主动放弃索引。索引失效核心原因:索引字段不能参与计算,一旦计算,无法走 B+ 树索引,会全表扫描。比如:表字段 utf8mb4,查询参数是 utf8,字符集不一致,索引失效。如 SERIALIZABLE 级别,或长事务导致索引失效、执行计划异常。原因:B+ 树是前缀匹配,模糊前缀无法定位索引。规则:or 两边必须都有索引,否则整体不走索引。解决:把运算放到等号右边,避免索引列计算。解决:使用覆盖索引或 ES 全文检索。

2026-05-21 14:57:03 247

原创 SQL优化实战总结

我给你整理成面试常问 + 工作能用的完整版,分四大块:索引优化、语句优化、结构优化、执行计划分析。查询字段全部在索引里,避免回表,Extra 出现 Using index。复合索引 idx(a,b,c),查询条件必须从 a 开始,不能跳过。• 分页优化:limit 1000000,10 极慢,用主键分页。字段尽量 not null,给默认值,避免 null 索引失效。• 尽量用 inner join,少用 left join。不用 select *,少用 in、not in、or。

2026-05-21 14:56:53 147

原创 SpringMVC执行流程

请求先到 DispatcherServlet,由 HandlerMapping 找到 Controller,HandlerAdapter 执行 Controller,返回 ModelAndView,再由 ViewResolver 解析视图并渲染,最后响应客户端,中间经过拦截器。DispatcherServlet 调用 HandlerMapping,根据 URL 找到对应的处理器 Handler(Controller)渲染视图,执行 拦截器完成方法(afterCompletion),最终响应给浏览器。

2026-05-21 14:56:41 219

原创 Spring事务失效的8种常见情况

原因:Spring AOP 只能拦截 public 方法,private/protected/default 不会生成代理,事务直接失效。原因:Spring 事务默认只在抛出运行时异常才回滚,你自己吞了异常,Spring 感知不到。原因:Spring 事务基于 ThreadLocal,不同线程是独立事务,互不影响。原因:通过 this 调用,不走 Spring 代理对象,事务注解不生效。原因:对象是 new 出来的,不是 Spring 代理对象,事务不生效。如果外层没有事务,当前方法就没有事务。

2026-05-21 10:18:35 287

原创 OOM常见场景和原因及解决方案

虚拟机栈/本地方法栈溢出 StackOverflowError / OOM: unable to create new native thread。OOM:OutOfMemoryError,JVM 没有足够内存分配给对象,也无法 GC 回收,直接崩掉。dump 堆内存,用 MAT/VisualVM 分析大对象、泄漏对象。• NIO、Netty 频繁分配 ByteBuffer 直接内存。用 Netty 合理使用内存池,避免频繁创建销毁缓冲区。适当调大 -Xms -Xmx,治标不治本,优先改代码。

2026-05-21 10:14:58 180

原创 Synchronized底层原理

synchronized 是 Java 内置的悲观锁,底层基于 JVM 指令 + 对象头 MarkWord + 监视器锁(Monitor) 实现。• monitorexit:释放锁,退出临界区(会生成2条,保证异常也能释放)获取锁 count+1,释放 count-1,count=0 才真正释放。• 原理:依赖操作系统 OS互斥锁(Mutex),线程阻塞进入等待队列。_EntryList: 阻塞池(竞争锁失败线程)• 锁状态(无锁、偏向锁、轻量级锁、重量级锁)无锁 → 偏向锁 → 轻量级锁 → 重量级锁。

2026-05-20 11:02:20 430

原创 SpringBean完整生命周期

postProcessBeforeInitialization(),可对 Bean 做前置增强。postProcessAfterInitialization(),可做 AOP 代理、动态增强。实例化 → 依赖注入 → Aware → 前置后置处理器 → 初始化 → 使用 → 销毁。自动装配 @Autowired、@Resource、XML 配置的属性,完成依赖注入。Spring 通过反射创建 Bean 对象,此时对象已存在,但属性为空。Bean 前置处理(BeanPostProcessor 前置)

2026-05-20 10:54:58 234

原创 Linux常用命令+具体实操用法

Linux 常用命令 + 具体实操用法(直接复制就能用)按日常工作高频分类,每条都给示例操作,新手直接照着敲。一、目录切换 & 查看cd /homecd …cd ~cd -3. ls 查看文件/目录lsls -lls -als -lh二、文件 & 文件夹操作mkdir testmkdir -p a/b/c2. touch 创建空文件touch demo.txt3. rm 删除文件/文件夹rm demo.txtrm -rf test注意:rm -rf 慎用,删了找不回4. cp 复制cp dem

2026-05-15 17:28:45 347

原创 Java面试宝典

• 缓存机制:Integer(-128~127)、Byte、Short、Long 有缓存。• 常用关键字:try、catch、finally、throw、throws。• StringBuffer:可变、线程安全、加了synchronized。• 重写:子类重写父类方法,方法名/参数/返回值一致,权限不能更严格。• JDK:JRE + 编译工具(javac)、调试工具,开发必备。• StringBuilder:可变、线程不安全、效率高(常用)• ArrayList:底层数组,查询快、增删慢,线程不安全。

2026-05-15 17:20:33 481

原创 Spring高频面试题及标准答案

• ApplicationContext:BeanFactory的扩展,容器启动立即初始化单例Bean,多了国际化、事件发布、资源加载、Web环境支持,开发常用。答案:不是线程安全。答案:在Bean创建、初始化前后提供扩展切入点,可以修改Bean属性、动态代理包装Bean,Spring AOP、依赖注入都依赖后置处理器实现。答案:开发时依赖抽象接口而非具体实现类,Spring通过IOC注入实现类,便于替换实现、降低耦合、利于扩展维护。场景:事务控制、日志记录、权限校验、接口限流、性能监控、统一异常处理。

2026-05-13 15:35:48 221

原创 Spring框架核心完整版

• SpringBoot:基于 Spring + SpringMVC 的快速脚手架,自动配置、内嵌容器,不用XML。Spring 是轻量级、开源、分层的 Java 开发框架,核心目的:解耦、简化开发、管理对象。• IOC:把对象创建、管理、依赖关系交给 Spring 容器,程序直接使用,不用自己 new。Spring Context:扩展容器,提供国际化、事件、资源加载。• Spring:底层核心框架(IOC、AOP、事务)适用场景:日志、事务、权限校验、接口限流、性能监控。

2026-05-12 16:13:59 309

原创 Java基础全套教程

System.out.println(“出现异常:” + e.getMessage());System.out.println(str.contains(“我”));System.out.println(name + " 在学习");System.out.println(“吃东西”);System.out.println(“狗叫”);map.put(“张三”,20);map.put(“李四”,22);九、常用集合(List/Map)方法定义、调用、参数、返回值。ArrayList 实例。

2026-05-12 16:13:05 341

原创 Spring常用注解大全

• @GetMapping / @PostMapping / @PutMapping / @DeleteMapping:限定请求方式。• @RestController = @Controller + @ResponseBody,直接返回JSON。• @Qualifier(“beanName”):配合@Autowired,按名称指定注入。• @ComponentScan:指定包扫描路径,扫描@Component等注解。• @After:后置通知(方法执行后,无论是否异常)

2026-05-09 10:34:50 454

原创 Springboot核心

SpringBoot:基于Spring框架的快速开发脚手架,自动配置、开箱即用,不用繁琐XML配置,快速开发微服务、后台接口。• @RequestMapping/@GetMapping/@PostMapping:接口路径映射。• @SpringBootApplication:启动类主注解,整合自动配置、包扫描。启动项目,访问:http://localhost:8080/hello 即可。• @RestController:接口控制器,返回JSON。自动配置:约定大于配置,自动加载Spring组件。

2026-05-09 10:29:59 312

原创 Java常用算法手写完整代码(可直接运行)

下面逐个给你:冒泡、选择、插入、希尔、快排、归并、堆排、二分查找、双指针、滑动窗口、DFS、BFS、动态规划 全套可运行代码。// 调用:quickSort(arr, 0, arr.length - 1);// 爬楼梯:每次1或2阶,求多少种走法。10. 二叉树 DFS 前序遍历。11. 二叉树 BFS 层序遍历。// DFS 前序:根 左 右。9. 双指针示例(两数之和)8. 二分查找(有序数组)// 逐个交换堆顶和末尾。// 合并两个有序区间。// 二分查找 迭代版。// 有序数组两数之和。

2026-05-08 09:37:35 403

原创 JAVA常用数据结构大全(分类+底层+特点+适用场景)

• ArrayDeque:数组实现双端队列,效率高于 LinkedList,推荐做栈/队列。• 特点:查询/增删 O(1)、无序、允许 null 键值、线程不安全。• 特点:查询快、尾部增删快、中间插入删除慢、线程不安全。• 线程安全、效率低、不允许 null,基本淘汰。• 特点:首尾增删极快、随机查询慢、线程不安全。• 特点:按键自然排序、不允许 null 键。• Arrays:数组排序、二分查找、转集合。• 特点:元素无序、不可重复、线程不安全。• 特点:查询快、增删慢、不能自动扩容。

2026-05-08 09:31:46 45

原创 Java常用开发常用工具类

分 JDK原生自带、Spring 自带、Apache 常用、集合/日期/字符串/文件/数学,都是工作、刷题、面试高频必用。Optional.ofNullable(obj).orElseGet(() -> 自定义);ObjectUtils.isEmpty() // 对象/集合/字符串统一判空。Collections.max()/min() // 取最大最小值。Collections.sort() // 集合排序。

2026-05-07 17:18:21 276

空空如也

空空如也

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

TA关注的人

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