自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt的多线程编程

当有多个线程在操作时,如果系统,则它根本不可能真正同时进行一个以上的线程,它只能把。

2022-09-01 23:21:23 2350 1

原创 TCP三次握手、四次挥手

如:一个报文段所发送的数据的序号值是301,携带的数据有100B,那么本报文段数据的最后一个字节序号是400,因此下一个报文段发送的数据的序号应该从401开始。阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)所谓“连接”,其实是客户端和服务器的。客户端只能发送数据不能接收数据,但2次握手便建立了连接,这种建立的连接显然是不可靠的。在连接的建立过程中,双方需要交换一些连接的参数。因为TCP连接的时候,采用三次握手建立的连接是双向的,在断开的时候需要。...

2022-08-05 20:55:40 687

原创 网络通信的过程

上层协议时如何使用下层协议提供的服务的呢?其实这是通过实现的。应用程序是在发送到物理网络上之前,将沿着协议栈从上往下依次传递。

2022-08-02 15:42:58 454

原创 进程通信的方式

不同进程(主要是指不同的用户进程)之间的资源是独立的,没有关联的,

2022-08-01 17:38:33 303

原创 进程调度算法

在多道程序系统中,。处理机调度是。

2022-07-29 17:03:08 373

原创 2.7.C++中static关键字的5种基本用法

然而我们将其定义为静态全局变量之后,在main.cpp中便不能访问a,因为静态全局变量的作用域只存在于当前源文件。可以看出改变了创建了两个A的实例b和c,改变了b中的s的值之后,在打印c中s的值也是改变后的值。可以看出,在main函数中成功调用了其他源文件中的函数。在全局变量前面加上satic关键字便成为静态全局变量,,因为局部变量存放在栈区,超出作用范围后就被系统回收。可以看出静态局部变量a的值每次都在增加,因为。,main函数中显然不能访问到。可以成功打印静态成员变量a。与静态成员变量不同,......

2022-07-28 17:34:58 855 1

原创 15.9为什么要将成员变量设置为private

代码】4.1.4为什么要将成员变量设置为private。

2022-07-27 22:23:28 1627

原创 0.0C++和C的区别

早期的C++就是C加上一些面向对象的特性即**(Cwithclasses)。STL是个template的程序库。它对容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。在C++每个次语言中,遵守各自的次语言守则。我们该如何理解C++这门语言呢?.这也是C语言的局限性所在。C++是以C语言为基础。这是面向对象设计的守则。C++如今是一个同时支持。...

2022-07-27 21:42:23 287

原创 虚拟内存和LRU页面置换算法

基于。

2022-07-20 17:15:51 764

原创 内存分配方式

虽然计算机硬件发展,内存容量在不断变大,但是,因此操作系统必须要对内存空间进行合理划分和有效动态分配。。经过预编译、编译、汇编后生成的。在进程运行时,,用户和程序员只知道逻辑地址。连接程序将进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过不同于放在硬盘上的可执行程序文件,当一个程序调入内存运行时,就构成了进程的内存映像。...

2022-07-19 16:42:48 1877

原创 死锁预防、死锁避免、死锁检测

多个进程并发执行,由于竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法推进,这就是死锁现象。例如:系统中只有一台打印机和一台输入设备,若进程p1正在占用输入设备,同时又提出使用打印机的请求;而进程p2正在占用打印机,同时又提出请求输入设备的请求。这样两个进程相互无休止地互相等待,均无法继续执行,此时这两个进程进入死锁状态。①系统资源的竞争只有对不可剥夺资源的竞争(如打印机) 才可能产生死锁,对可剥夺资源的竞争是不会产生死锁的。②进程推进顺序非法进程在运行过程中,请求和释放资源的顺序不当,

2022-07-12 23:02:21 6229 2

原创 12.快速排序

**①问题1:**给定一个数组arr和一个数num,将小于等于num的数放在数组的左边大于num的数放在数组的右边(不要求有序)。要求额外空间复杂度为O(1),时间复杂度为O(N)。遍历数组元素,根据以下两种情况处理:【例】给定数组nums[3 5 6 7 4 3 8],给定一个数num【代码如下】**②问题2:(荷兰国旗问题):**给定一个数组arr和一个数num,将小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度为O(1),时间复杂度为O(N

2022-07-11 15:17:44 158

原创 12.单调栈——解决接雨水和柱状图中的最大矩形等问题

单调栈1.单调栈实现结构单调栈解决的问题:给你一个数组,想要用尽可能低的代价知道数组中每一个元素的左边元素比它大的或者右边元素比他大的信息是什么。如果用暴力方法,左边遍历一次右边遍历一次,时间复杂度为O(N^2),用单调栈的方法可以使得时间复杂度变成O(N)。【例】求数组[5 4 6 7]每个元素左、右两边比他大最近的元素下标。5左边比他大的无、右边比它大的元素6对应的2;4左边比它大的5对应的下标0、右边比它大的元素6对应的下标2;6左边比它大的无、右边比它大的元素7对应的下标3;7左边比它

2022-04-28 22:56:34 222

原创 11.滑动窗口的最大值——重要结构双端队列

滑动窗口最大(小)值1.滑动窗口最大值结构窗口概念:一开始窗口左边界L、有边界R都停留在数组左侧,窗口L和R都只能往数组右边移动,并且左边界L永远不能超过有边界R。任何时刻都能选择让L或者R往右移动,但要时刻保持上述原则,这样不断移动的过程就形成了滑动窗口。我们要解决的问题就是:每次用非常小的代价求得滑动窗口的最大值。简单做法就是每次都遍历一遍滑动窗口,但这样代价就很高,有没有一种结构让每次求得滑动窗口最大值的代价很小?我们可以利用双端队列来实现这样的功能。1.1滑动窗口最大值实现结构——双端

2022-04-26 12:00:39 674

原创 10.Manacher算法(用于解决回文子串问题)

Manacher算法1.Manacher算法解决的问题字符串str中,最长回文子串的长度如何求解?如何做到时间复杂度O(N)完成?回文序列是从左往右和从右往左看一样,如abba,从左往右是abba,从右往左也是abba一样。测试用例:abc12320de1,最长回文子串为232,长度为2.1.1一般想到的解法以每一个位置为对称轴向两边扩展,看看以每个位置为中心能扩多大。例如:a121b11311c但是这个思路只能找到长度为奇数的回文,不能找到长度为偶数的回文。例如:0110按这种方法

2022-04-25 12:02:37 977

原创 9.KMP算法

KMP算法1.KMP算法解决的问题字符串str1和str2,str1是否包含str2,如果包含返回str2在str1中开始的位置,如果不包含返回-1。如果做到时间复杂度O(N)完成?测试用例:str1 = “ABC1234de”, str2 = “1234”.返回3。1.1最大相等前后缀如一个序列abbabbk,求字符k的最大相等前后缀。因此,序列abbabbk中k的最大相等前后缀长度为3。注意:前后缀是k之前的序列的前后缀不包括k。最大相等前后缀长度不能是前后缀的整体,这样没有意义。

2022-04-13 17:28:09 515

原创 8.岛问题

岛问题【题目】一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?【例子】0 0 1 0 1 01 1 1 0 1 01 0 0 1 0 00 0 0 0 0 0这个矩阵中有三个岛。【进阶】如何设计一个并行算法解决这个问题。【思路】有一个infect函数,会把连城一片的1全变成2。深度优先遍历或者宽度优先遍历这个矩阵,遇到是1的元素则调用infect函数,最后调用了多少次infect函数就有多少

2022-04-12 10:38:23 795

原创 6.暴力递归转动态规划

动态规划1.什么是动态规划?动态规划就是暴力递归(回溯)的过程中有重复调用的过程,动态规划在算过每次调用后把答案记下来,下次再遇到重复过程直接调用这个行为就叫动态规划。动态规划就是对有重复调用过程的暴力递归过程的优化。例子:斐波那契数列f(n) = f(n - 1) + f(n - 2),f(1) = 1, f(2) = 1。求f(5)可以看出求F(5)的过程中会有很多的重复调用(红色的为重复调用),这种重复过程会浪费大量的时间。如果我们重复过程我们之前算过,我们给它记到一个表里去,如果下次再

2022-03-24 16:54:42 903 1

原创 4.二叉树的遍历(C++版)

二叉树的递归1.二叉树递归遍历二叉树的递归序递归序过程:两个注释1之间的代码代表第一次来到一个节点的时候,会判断一下这个节点是否为空;来到这个节点的左树去遍历。遍历完第二次回到本函数,进行两个注释2之间进行操作,两个注释2之间可以进行某些操作也可以不进行某些操作,但是一定会返回本函数。来到这个节点的右树去遍历。遍历完第三次回到本函数,进行两个注释3之间进行操作,两个注释3之间可以进行某些操作也可以不进行某些操作,但是一定会返回本函数。本函数结束,返回。void traversal(T

2022-03-01 16:24:44 1984 2

原创 2.O(NlogN)的排序算法

认识O(NlogN)的排序算法1.剖析递归行为及其时间复杂度的估算递归过程:递归过程是一个多叉树,计算所有树的结点的过程就是利用栈进行后序遍历,每个结点通过自己的所有子结点给自己汇总信息之后才能继续向上返回,栈空间就是整个树的高度。例题①用递归方法找一个数组中的最大值。int process(vector<int> &nums, int L, int R) { if (L == R) { return nums[L]; } //>&g

2022-02-24 20:38:36 603

原创 1.时间复杂度和简单排序算法

时间复杂度和简单排序算法1.时间复杂度如果一个算法的最差情况操作次数为O(aN^2 + bN + c),则时间复杂度为O(N^2)。只取最高项且系数为1。如果两个算法1和算法2时间复杂度指标都一样都是O(N),但是算法1N的常数项是10,算法2的N的常数项为1,算法1不一定比算法2好,因为算法1的常数项10可能是位运算,算法2的常数项1可能是乘法运算。评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数时间”。2.简单排序算法例题①选择排序:每次循环交

2022-02-19 17:26:44 432

原创 4.2KMP算法

KMP算法KMP算法是用来解决字符串匹配的问题。*如:求文本串aabaabaaf中是否出现过模式串aabaaf。设遍历文本串时间复杂度为O(n),遍历模式串时间复杂度为O(m)。*显然,暴力法求解是两层for循环,时间复杂度为O(m × n)。下面介绍的KMP算法时间复杂度将会大大提高,为O(m + n)。1.前缀表①前缀和后缀前缀:包含首字母,不包含尾字母的所有子串。后缀:包含尾字母,不包含首字母的所有字串。如:aabaaf前缀包括:a、 aa、 aab、aaba、 aabaa

2022-02-14 20:54:03 284

原创 8.七大排序算法

七大排序1.排序的基本概念与分类①排序的基本概念假设有n个记录的序列为{r1, r2, …, rn},其对应的关键字分别为{k1, k2, k3, …, kn},需要确定1, 2, …, n的一种排列p1, p2, …, pn,使得其对应的关键字满足,kp1 ≤ kp2 ≤ … ≤ kpn,即使得序列称为一个按关键字有序的序列{rp1, rp2, … rpn},这样的操作就叫做排序。如:序列关键字为{2, 3, 5, 1},对其进行升序排列后,得到的结果为{1, 2, 3, 5}。②排序的稳定性

2021-12-06 22:40:50 3728 14

原创 7.9哈希表(散列表)

哈希表(散列表)我们先来看看之前所学的各种查找结构的优缺点:顺序查找表:查找需要从表头开始挨个元素进行比较,速度很慢,时间复杂度为O(n)。插入删除速度很快直接插入就行了,时间复杂度为O(1)。有序查找表:由于是有序的,所以查找速度就快了很多,为O(logn)。插入删除由于需要移动记录,速度比较慢,时间复杂度为O(logn)。二叉排序树、平衡二叉树、红黑树:查找和插入删除效率都不错,为O(logn)。我们发现,上述查找结构都不可避免要比较各个元素,有没有一种方法不需要比较,而直接通

2021-12-01 14:53:41 809

原创 7.8红黑树

红黑树红黑树的本质是对2-3-4树的概念模型,是与2-3-4树等价的二叉树。在红黑树中插入元素类似2-4树,但是红黑树是二叉树,维护起来更容易。1.2-3-4树与红黑树的转换2-3-4树是一棵阶为4的B树,存在2结点,3结点和4结点。每当一个3结点或4结点转换成2结点时,都会增加树的高度。2-3-4树中2结点都是黑色结点,3结点和4结点都是红结点+黑结点表示。红色结点用来表示与黑色父结点的结合,即红结点不能单独看,红节点和他连接的黑色父结点构成一个整体。①2、3、4结点用红黑树表示方式如下:2结

2021-11-29 22:40:35 431

原创 7.7 B树和B+树

2-3树和2-3-4树内存是由硅制的存储芯片组成,这种技术存储成本比磁盘存储贵很多,因此,目前,磁盘容量很大基本都在1T以上,而内存一般还是8g、16g的水平。内存上处理数据的速度比磁盘处理数据的速度快很多。大多数数据结构处理数据都在内存中,但是如果我们操作的 数据特别大,内存已经没法处理了,这种情况下对 数据的处理就需要不断从硬盘或u盘这些存储设备中调入或调出内存页面。一旦涉及这样的操作,就 必须考虑对硬盘等外部存储设备的访问时间和访问次数。访问的 次数越多,显然 花费的时间越多,时间复杂度越高,我们

2021-11-27 17:10:10 530

原创 7.6平衡二叉树(AVL树)

平衡二叉树(AVL树)平衡二叉树是一种二叉排序树,平衡二叉树的出现是为了解决二叉搜索树因为高度太高而查找效率下降的问题。如:对于数组a[10]={3,2,1,4,5,6,7,10,9,8}.分别构建二叉搜索树和平衡二叉树。如果要查找结点8,左边二叉搜索树搜索过程为:3->4->5->6->7->10->9->8,要查找8次。而平衡二叉树搜索过程为:4->7->9->8,只要搜索8次,可以看出当二叉搜索树高度变得很高之后搜索效率会下降很多。

2021-11-26 11:47:00 561

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

二叉排序树(二叉搜索树)顺序查找表插入、删除操作效率不错,但是由于是无序的,所以查找效率很低。而有序查找表查找效率还行,但由于有序,因此在插入和删除操作后为了保持有序需要花费很大的时间。如果我们想找一种插入、删除和删除效率都不错的数据结构来存放动态查找表,可以使用二叉搜索(排序)树。1.二叉搜索(排序)树定义二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树的所有结点的值均小于它的根的值。若它的右子树不空,则

2021-11-25 16:49:39 467 1

原创 7.3二分查找法和插值查找法

有序表查找对一个无序的线性表进行查找一个元素时是比较困难的,然而对线性表排序后在进行查找那么查找效率就会高很多。接下来介绍3种对有序表的查找方法。1.二分查找法二分查找法(折半查找法):前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找

2021-11-24 16:55:16 771

原创 7.2顺序表查找

顺序查找一堆未排序的书放置在书架上,它们构成了一个线性表。我们要针对这一线性表进行查找操作,于是这个线性表就构成了静态查找表。顺序查找:又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。1.顺序查找算法顺序查找的算法实现如下://顺序查找,a为数组,n为要查找的数组个数,k

2021-11-24 11:16:05 743 1

原创 7.1查找概论

7.1查找概论如今我们在计算机上进行的所有操作几乎都会涉及查找操作,例如,百度搜索今日天气;打开b站搜索喜欢的up主的视频等都要涉及到查找操作。所有这些需要被查的数据所在的集合,我们给它一个统称叫查找表。①基本概念查找表:是由同一类型的数据元素(记录)构成的集合。关键字(key):数据元素(记录)中某个数据项的值,由称为键值。用它可以标志一个数据元素(记录);也可以标志一个数据元素(记录)的某个数据项(字段),我们称为关键码。主关键字:如果关键字可以唯一地标志一个记录,则称此关键字为主关键字。 这

2021-11-24 10:35:51 489 1

原创 6.2.2图的存储结构——邻接表法

图的存储结构——邻接表法对于边数相对顶点较少的图,用邻接矩阵法会对存储空间造成极大的浪费。如下图:邻接矩阵除了arc[1] [0]有权值外,没有其他弧,其实这些存储空间都浪费掉了。对于这种结构,我们可以使用数组与链表相结合的存储方法,称为邻接表。邻接表的处理方法如下:图中顶点用一个一维数组存储。对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点边的信息。图中每个顶点vi的所有邻接点构成表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有

2021-11-23 15:55:59 2492 1

原创 6.6拓扑排序

拓扑排序在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示网的图,我们称为AOV网。例如,我们的升学,只有上完小学才上中学,上了中学才能上大学,上了大学才能上研究生等。1.拓扑排序介绍设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,….vn,若满足从顶点vi到vj之间有一条路径,则在顶点的序列中顶带你vi必须在顶点vj之前。我们称这样的序列为一个拓扑序列。所谓拓扑排序就是对一个有向图构造拓扑序列的过程。如:两个拓扑序列为:c1,

2021-11-23 14:36:35 1164 1

原创 6.5最短路径

最短路径对于网图来说,最短路径是指两顶点之间经过的边上的权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。下面主要介绍两种解决最短路径的算法:迪杰斯特拉(Dijkstra)算法:主要从某个源点到其余各顶点的最短路径问题。时间复杂度为O(n^2)弗洛伊德(Floyd)算法:主要用来解决从所有顶点到所有顶点间的最短路径问题。时间复杂度为O(n^3)。1.迪杰斯特拉(Dijkstra)算法下面从一个例子开始:例:用迪杰斯特拉算法对下列网图求顶点1到各顶点的最短路径。

2021-11-22 20:39:21 803 1

原创 6.4最小生成树

假设你是电信实施工程师,需要为5个村庄架设通信网络做设计,即把这5个村庄都用电缆连接起来,要求用最小的成本来完成这项任务。村庄位置如下,连线之间数字表示村与村间可通达的直线距离,结点之间没有连线表示有高山或湖泊不予考虑。这个网用邻接矩阵法表示为:连接起这5个村庄至少要4条路径。显然,连通网(网的任意两个节点之间都有路径连接)的生成树(包含图中全部顶点,但只有足以构成树的n-1条边)满足要求,比生成树路径还多显然浪费了资源,那么这个问题就转换成如何求连通网的最小生成树。主要有两种方法可以找到连通网的

2021-11-19 21:52:31 696 1

原创 6.3深度优先遍历和广度优先遍历

图的遍历图的遍历与树的遍历类似,希望从图中某一顶点出发访问图中其余顶点,且每个顶点只访问一次,这一过程就叫做图的遍历。1.深度优先遍历深度优先遍历,也称为深度有限搜索,简称DFS。从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图直至所有和v有路径相通的顶点都被访问到。类似于树的前序遍历。例如:对如下的图进行深度优先遍历,假设在没碰到重复顶点的情况下始终访问最右手的顶点,访问过的顶点会被标记。遍历过程为:从a开始,标记a。此时有3个分支b、c、e,b为最右手顶点,

2021-11-19 14:43:50 1038 1

原创 6.2.1图的存储结构——邻接矩阵法

图是由顶点和边组成,直接存储比较困难,但是可以对顶点和边分别存储。顶点可以用一个一维数组存储顶点信息。边或弧是顶点之间的关系,可以用一个二维数组来存储。邻接矩阵法就是用这种方法来存储图的。图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组来存储图中顶点的信息,一个二维数组(称为邻接矩阵)用来存储图中的边或弧的信息。我们先来看无向图的邻接矩阵存储方式。①无向图的邻接矩阵存储方式设图有n个顶点,则邻接矩阵就是一个n×n的矩阵。例:矩阵主对角线全为0是因为顶点不存在到自身的边;arc[0] [2

2021-11-18 21:24:23 2866 1

原创 6.1图的定义

图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为 G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。定义中值得注意的几个点有:图中数据元素我们称之为顶点(vertex),而再线性表中我们称之为元素,树中我们称之为结点。图中不允许顶点集为空,但允许边集为空。线性表中,相邻元素具有线性关系;树结构中,相邻两层的结点具有层次关系;图中,任意两个顶点之间可能都有关系,顶点之间的逻辑关系用边来表示。本章介绍的图都是简单图,所谓简单图就是:不存在顶点到

2021-11-18 16:40:32 1567 1

原创 5.7树、森林与二叉树的转换

树、森林与二叉树的转换1.树转换成二叉树树转换成二叉树的步骤如下:加线。所有兄弟之间加一条连线。去线。对树的每个结点,只保留它与第一个孩子的连线,删除它与其他孩子的连线层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定的角度,结点的左孩子是原来结点的第一个孩子,右孩子是结点原来的兄弟。例:把下面的树转换成二叉树2.森林转换为二叉树森林是由若干棵树组成,可以理解为,森林中的每一棵树都是兄弟,可以按照兄弟的处理方法来操作。将森林转换成二叉树的步骤如下:把每棵树转换成二叉树。第一棵

2021-11-15 21:08:17 3632 1

原创 5.6遍历二叉树

遍历二叉树相同数量的100元和20元钞票落在地上,要想一定时间内捡的钱最多,大家肯定是先捡100元的,因为捡1张100元的等于捡了5张20元的,效率高了很多。捡钱顺序非常重要!对于二叉树来说,次序同样很重要。 例如,人生会有很多十字路口,就像一个二叉树,初中升高中还是职业学校,高中升大学还是大专,专业选热门还是喜欢的……你选择的次序会直接影响你的人生。其实上面的人生,大多数人都不需要选择,因为心里都直到哪条路更好。二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中的结点,使得每个结点被访问一

2021-11-15 17:06:56 783 1

空空如也

空空如也

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

TA关注的人

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