- 博客(428)
- 收藏
- 关注
原创 leetcode刷题(133)——剑指 Offer 07. 重建二叉树
递归共建立 N个节点,每层递归中的节点建立、搜索操作占用 O(1) ,因此使用 O(N)时间。递推参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right;在中序遍历中搜索根节点 node 的索引 ,可将 中序遍历 划分为 [ 左子树 | 根节点 | 右子树 ]。根据中序遍历中的左(右)子树的节点数量,可将 前序遍历 划分为 [ 根节点 | 左子树 | 右子树 ]。输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
2022-11-25 10:25:52 442
原创 leetcode刷题(132)——完全背包问题思路理解
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以这里还是以纯完全背包问题进行讲解理论和原理。对照01背包的代码,就是将第二个循环从小到大进行枚举即可。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。版本1:这是朴素版本的,时间复杂度O(nm^2)
2022-11-18 10:15:53 460
原创 leetcode刷题(130)——最大得分的路径数目
给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。一条路径的 「得分」 定义为:路径上所有数字的和。请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。
2022-11-10 14:41:31 425
原创 leetcode刷题(129)——576. 出界的路径数
给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn]。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。
2022-11-08 20:50:47 378
原创 leetcode刷题(128)——1575. 统计所有可行路径,动态规划解法
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量每一步中,如果你在城市 i ,你可以选择任意一个城市 j ,满足 j!= i 且 0
2022-11-08 15:43:29 348
原创 leetcode刷题(127)——1575. 统计所有可行路径,DFS解法
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量每一步中,如果你在城市 i ,你可以选择任意一个城市 j ,满足 j!= i 且 0
2022-11-07 21:18:53 331
原创 leetcode刷题(126)——1289. 下降路径最小和 II
给你一个 n x n 整数矩阵 arr ,请你返回 非零偏移下降路径 数字和的最小值。非零偏移下降路径 定义为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。
2022-11-06 16:50:28 378
原创 leetcode刷题(125)——931. 下降路径最小和
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1)。
2022-11-06 12:28:20 242
原创 leetcode刷题(124)——64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
2022-11-05 22:00:24 164
原创 leetcode刷题(123)——63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。提示:obstacleGrid[i][j] 为 0 或 1。
2022-11-05 21:25:13 132
原创 leetcode刷题(122)——62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?提示:题目数据保证答案小于等于 2 * 109。
2022-11-05 20:45:19 504
原创 Android面试每日一题(6):BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别?
LocalBroadcastReceiver 是应用内广播,利用Handler实现,利用了IntentFilter的match功能,提供消息的发布与接收功能,实现应用内通信,效率和安全性比较高,仅支持动态注册。BroadcastReceiver 是跨应用广播,利用Binder机制实现,支持动态和静态两种方式注册方式。其他程序无法将广播发送到我们程序内部,不会有安全漏洞。发送的广播不会离开我们的应用,不会泄露关键数据。优先级相同的广播,动态注册的广播优先处理。广播接收者还能对广播进行截断和修改。...
2022-08-16 23:39:49 980
原创 Android面试每日一题(5):抽象类与接口的区别?
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;接口中不能含有构造器、静态代码块以及静态方法,而抽象类可以有构造器、静态代码块和静态方法;抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法;抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法;...
2022-08-16 23:33:07 884
原创 Android面试每日一题(4): 哪些情况下会导致oom问题?
低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了系统Kill应用进程,与其让系统kill进程还不如浪费一些用户体验,自己主动回收内存。②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏。1、根据java的内存模型会出现内存溢出的内存有堆内存、方法区内存、虚拟机栈内存、native方法区内存;...
2022-08-11 16:49:10 1122
原创 Android面试每日一题(3): LaunchMode 的应用场景?
Standard 模式是系统默认的启动模式,一般我们 app 中大部分页面都是由该模式的页面构成的,比较常见的场景是:社交应用中,点击查看用户A信息->查看用户A粉丝->在粉丝中挑选查看用户B信息->查看用户B粉丝…SingleInstance 模式常应用于独立栈操作的应用,如闹钟的提醒页面,当你在A应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到A的视频页面,这样就不会过多干扰到用户先前的操作了。所以在我们的应用中一般不会用到。...
2022-08-11 16:05:50 232
原创 Android面试每日一题(2): 一般什么情况下会导致内存泄漏问题?
低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了。②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏。(3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus。1、内存泄漏的根本原因在于生命周期长的对象持有了生命周期短的对象的引用。⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收。...
2022-08-11 15:42:56 306
原创 Android面试每日一题(1): Handler 如何有效地避免内存泄漏问题
问题在于该Handler的实例采用了内部类的写法,它是ShanActivity这个实例的内部类,在Java中,关于内部类有一个特点:在java中,非静态的内部类和匿名内部类都会隐式的持有一个外部类的引用。在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue。如果Handler中是一个2秒的操作,在Activity退出的2s后,释放了Activity的指针,这种情况属于短时间的内存泄漏?......
2022-08-09 18:47:04 355
原创 [万字长文]一文带你深入了解Android Gradle
作为每一个Android研发,相信对gradle并不陌生,android studio新建每个项目或者module都会自动生成gradle文件,AS默认也是采用Gradle作为构建工具的,相信下面这张流程图,大家一定都很眼熟但是apk打包背后是如何gradle产生联系,以及gradle还能为我们平时的开发工作带来哪些帮助并不是都能有时间了解,那么本文就将带大家深入理解Android Gradle。看完本文,你将了解到这些内容:1.掌握 gradle 的基本使用2.了解 gradle 及 andro
2022-05-12 17:15:38 3939
原创 给Android工程师的音视频教程之一文弄懂MediaCodec
MediaCodec是Android提供的用于对音视频进行编解码的类,是Android Media基础框架的一部分,一般和 MediaExtractor, MediaMuxer, Surface和AudioTrack 一起使用。
2022-02-19 22:40:18 5184
原创 给Android工程师的音视频开发学习指南
毕业至今,之前一直从事Android开发的工作,今年5月份开始接触音视频开发相关工作,于是打算写一个音视频相关专栏,让移动端的同学,能通过这个专栏快速掌握音视频相关知识,首先带来第一篇,移动端的音视频技术涉及哪些?1. 整体流程以手机直播为例,其整体流程如下:2. 数据采集2.1. 音频采集音频采集涉及到以下几点:检测麦克风是否可以使用; 需要检测手机对某个音频采样率的支持; 在一些情况下需要对音频进行回声消除处理; 音频采集时设置正确的缓冲区大小。在 Android 系统中,一般使用 Au
2021-11-28 11:04:51 555 2
原创 Flutter原理—布局绘制
真正的布局和大小计算等行为,都是在 RenderBox 上去实现的。 不同的 Widget 通过各自的 RenderBox 实现了“差异化”的布局效果。所以找每个 Widget 的实现,找它的 RenderBox 实现就可以了。所以在 Flutter 中,最终页面的 Layout、Paint 等都会发生在 Widget 所对应的 RenderObject 子类中,而 RenderObject 也是 Flutter 跨平台的最大的特点之一:所有的控件都与平台无关 ,这里简单的人话就是: Flutte
2021-07-04 17:14:02 482 1
原创 Flutter原理—深入Widget原理
事实上在 Flutter 中渲染是经历了从 Widget 到 Element 再到 RenderObject 的过程。Widget 只是 Element 的一个配置描述 ,告诉 Element 这个实例如何去渲染。Widget 和 Element 之间是一对多的关系 。实际上渲染树是由 Element 实例的节点构成的树,而作为配置文件的 Widget 可能被复用到树的多个部分,对应产生多个 Element 对象。RenderObject 才是实际的渲染对象,而通过 Element 源码我们可以看出
2021-07-04 16:36:23 438
原创 android签名原理
为什么要签名?确保Apk来源的真实性。确保Apk没有被第三方篡改。什么是签名?在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。apk组成dex:最终生成的Dalvik字节码。res:存放资源文件的目录。asserts:额外建立的资源文件夹。lib:如果存在的话,存放的是ndk编出来的so库。META-INF:存放签名信息MANIFEST.MF(清单文件):其中每一个资源文件都有
2021-03-24 19:54:30 1029
原创 JNI原理
JNI方法注册方式Android系统在启动启动过程中,先启动Kernel创建init进程,紧接着由init进程fork第一个横穿Java和C/C++的进程,即Zygote进程。Zygote启动过程中会AndroidRuntime.cpp中的startVm创建虚拟机,VM创建完成后,紧接着调用startReg完成虚拟机中的JNI方法注册。1.android系统启动时候已经预注册好这种多出现在android自己系统代码里提供的注册方法startRegAndroidRuntime.cppint And
2021-03-15 20:24:53 1246
原创 java中error和exception的区别
Error类和Exception类的父类都是throwable类,他们的区别是:Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checke
2021-03-14 18:26:41 627
原创 Class 对象在执行引擎中的初始化过程
一个 class 文件被加载到内存中需要经过 3 大步:装载、链接、初始化。装载装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。链接链接过程分为 3 步:验证、准备、解析。验证:初始化这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。1.文件格式检验:检验字节流是否符合 class 文件格式的规范,并且能被当前版本的虚拟机处理。2.元数据检验:对字节码描述的信息进行语义分
2021-03-14 16:46:21 211
原创 Android匿名共享内存
ashmem的使用流程如下:1.ashmem_create_region创建匿名共享内存区域,本质是调用open系统调用2.ioctl设置共享内存的名字和大小,设置的名字为/dev/ashmem/,名字的存在就为了能够让其他人找到目标3.mmap映射文件中的虚拟内存以及物理内存4.直接对着这一块地址区域读写。其中ioctl必须设置名字和大小,不然没办法进行映射,因为在映射之前进行了校验。那么ashmem和Binder有什么区别呢?Binder的mmap时候已经通过伙伴系统绑定了物理页和虚拟内存
2021-03-01 18:18:28 985
原创 写给Android开发的Binder指南
为什么选用binder?Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。性能Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂
2021-03-01 17:42:41 339 3
原创 https原理
HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:① 证书验证阶段:1)浏览器发起 HTTPS 请求;2)服务端返回 HTTPS 证书;3)客户端验证证书是否合法,如果不合法则提示告警。② 数据传输阶段:1)当证书验证合法后,在本地生成随机数;2)通过公钥加密随机数,并把加密后的随机数传输到服务端;3)服务端通过私钥对随机数进行解密;4)服务端通过客户端传入的随机数构造对称加密算法,对返回
2021-03-01 15:21:51 152 1
原创 Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳包),一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。比如Http的,只是
2021-03-01 14:42:30 566
原创 Java中的各种锁
参考:https://tech.meituan.com/2018/11/15/java-lock.html乐观锁 VS 悲观锁悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,
2021-02-28 18:00:06 198
原创 mmap分析
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享进程的虚拟地址空间,由多个虚拟内存区域构成。虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同样特
2021-02-28 17:52:28 398
原创 TCP/IP多路复用
所有网络通信的本质目标就是进程间通信。除了寻址(Addressing),IP 协议还有一个非常重要的能力就是路由。寻址告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。寻址更像在导航,路由更像在操作方向盘。多路复用一台机器上的应用可以有很多。但是实际的出口设备,比如说网卡、网线通常只有一份。因此这里需要用到一个叫作多路复用(Multiplex)的技术。多路复用,就是多个信号,复用一个信道。传输层多路复用多个请求复用一个 TCP 连接。多个请求相当于并行的发送请求。即使其
2021-02-28 17:16:40 5923 1
原创 udp协议:udp和tcp相比快在哪里?
TCP 协议,是一个支持可靠性的协议。UDP 协议,是一个不支持可靠性的协议。校验和(Checksum)最简单的校验和算法:纵向冗余检查UDP 不支持可靠性,但是像校验和(Checksum)这一类最基本的数据校验,它还是支持的。不支持可靠性,并不意味着完全放弃可靠性。TCP 和 UDP 都支持最基本的校验和算法。对于 TCP 和 UDP,都实现了校验和算法,但二者的区别是,TCP 如果发现校验核对不上,也就是数据损坏,会主动丢失这个封包并且重发。而 UDP 什么都不会处理,UDP 把处理的权利交给
2021-02-28 16:54:10 2038
原创 AspectJ与ASM与Javaassist
AspectJ的缺点是,由于其基于规则,所以其切入点相对固定,对于字节码文件的操作自由度以及开发的掌控度就大打折扣。还有就是我们要实现的是对所有方法进行插桩,所以代码注入后的性能也是我们需要关注的一个重要的点,我们希望只插入我们想插入的代码,而AspectJ会额外生成一些包装代码,对性能以及包大小有一定影响。...
2021-02-24 21:32:52 2276
原创 Android面试问题汇总
设计模式相关1.设计模式6大原则1.1单一职责原则:就一个类而言, 应该仅有一个引起它变化的原因。1.2开放封闭原则:类、模块、函数等应该是可以拓展的,但是不可修改。1.3里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。核心思想:在使用基类的的地方可以任意使用其子类,能保证子类完美替换基类。1.4依赖倒置原则:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。问题描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码
2021-02-24 20:21:49 472 2
原创 GC垃圾回收
强引用:代码中普遍存在的,只要强引用还存在,垃圾收集器就不会回收掉被引用的对象。软引用:SoftReference,用来描述还有用但是非必须的对象,当内存不足的时候会回收这类对象。弱引用:WeakReference,用来描述非必须对象,弱引用的对象只能生存到下一次GC发生时,当GC发生时,无论内存是否足够,都会回收该对象。虚引用:PhantomReference,一个对象是否有虚引用的存在,完全不会对其生存时间产生影响,也无法通过虚引用取得一个对象的引用,它存在的唯一目的是在这个对象被回收时可以收到一
2021-02-24 20:09:41 187
基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统
2024-05-27
大麦抢票辅助(只抢待开抢中的)
2024-04-27
大麦网演唱会抢票软件,一个基于 tauri + rust + vue 调用接口的抢票软件
2024-04-21
某宝、某猫抢购,抢电视、抢茅台
2024-04-21
i茅台app自动预约,每日自动预约,支持docker一键部署
2024-04-21
python 12306 购票助手
2024-04-21
SpringBoot网上商城是一个基于Spring Boot的综合性B2C仿天猫电商平台
2024-04-20
JAVA+SpringBoot网上商城
2024-04-20
Java+SpringBoot网上商城
2024-04-20
基于Java+Springboot电影购票系统
2024-04-20
基于Java+Springboot的景区旅游信息管理系统
2024-04-20
基于springboot 网上花店商城 springboot+MybatisPlus+mysql
2024-04-20
java基于springboot的宠物商城 Spring Boot+Mybatis+mysql+Thymeleaf+Shiro
2024-04-20
基于Java+Springboot+vue的宠物交易/领养系统
2024-04-20
基于springboot房屋租赁系统 springboot+mybatis+mysql+shiro
2024-04-20
基于JAVA+Springboot的OA人事管理系统
2024-04-20
基于Vue和SpringBoot的超市账单管理
2024-04-20
基于Java+Springboot的酒店预订管理系统
2024-04-20
机器学习面试复习资源集合
2024-04-20
Tensorflow实战学习笔记、代码、机器学习进阶系列
2024-04-20
算法工程师-机器学习面试题总结
2024-04-20
使用机器学习算法完成对12306验证码的自动识别
2024-04-20
PAT-GPLT(中国高校计算机大赛团体程序设计天梯赛)题解
2024-04-20
2021年华为杯第十八届中国研究生数学建模竞赛D题解决方案(国二)
2024-04-20
2020中国华录杯·数据湖算法大赛-定向算法赛(吸烟打电话检测)决赛第二名项目代码
2024-04-19
12306抢票脚本源码
2024-04-17
大麦网自动购票脚本, 支持docker一键部署
2024-04-17
数据库设计课程设计-高校选课管理系统
2024-04-16
大麦抢票脚本 V1.0 已有大佬验证可以成功!
2024-04-13
东方财富网股吧爬虫,爬取帖子及其评论的相关信息,并储存到数据库中(附详细操作说明)
2024-04-13
某乎爬虫,用于爬取某乎页面 话题 问题 回答 评论 的爬虫 支持 asyncio 异步高并发 支持多用户登陆
2024-04-13
掘金小册爬虫脚本 将小册保存为 markdown,pdf,html 格式
2024-04-13
轻量型A股每日数据爬虫项目
2024-04-13
新浪某博热榜爬虫,利用 Github Action 的调度脚本
2024-04-13
矩阵快速幂求解斐波那契
2024-04-13
走迷宫 广度优先搜索与优先队列
2024-04-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人