自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

https://blog.csdn.net/WL0616

https://blog.csdn.net/WL0616

  • 博客(42)
  • 收藏
  • 关注

原创 【排序(ACM模式)】冒泡、选择、插入、快排

排序算法1. 冒泡2. 选择3. 插入4. 快排1. 冒泡#include <iostream>#include <vector>using namespace std;void print(vector<int>&nums){ for (auto i : nums) cout << i << " "; cout << endl;}void bubblesort(vector<int>&

2021-09-26 15:11:11 315

原创 【C++】类的成员函数:构造、析构、拷贝构造、运算符重载

这目录1.类的六个默认成员函数2.构造函数2.1构造函数是干什么的?2.2概念2.3特性3.析构函数3.1概念3.2特性4.拷贝构造函数4.1概念4.2特性4.3浅拷贝与深拷贝5.运算符重载5.1运算符重载5.2赋值运算符重载5.2.1指针悬挂问题关于浅层赋值的例子5.2.2用深层复制解决指针悬挂问题关于深层复制的例子,增加了一个自定义的赋值运算符重载函数。1.类的六个默认成员函数2.构造函数2.1构造函数是干什么的?该类对象被创建的时候,编译系统给对象分配内存空间,并自动调用该构造函数,由构造函

2021-08-21 10:18:08 467

原创 【STL】set、map、multiset、multimap

目录1.set2.map3.multiset4.multimap序列式容器:其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器:其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即

2021-08-14 10:25:12 241

原创 【C/C++】多态

目录1.多态的概念1.1什么是多态?1.2为什么要用多态呢?1.3多态有什么好处?2.多态的定义及实现2.1继承中构成多态的条件2.2虚函数2.3虚函数的重写2.4C++11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比3.抽象类3.1概念3.2实现继承和接口继承4.多态的原理4.1虚函数表4.2多态的原理4.3 动态绑定与静态绑定5.单继承和多继承关系的虚函数表5.1 单继承中的虚函数表5.2 多继承中的虚函数表1.多态的概念1.1什么是多态?多态是在不同继承关系

2021-08-13 15:14:29 450 1

原创 【C++】继承

目录1.继承的概念及定义1.1继承的概念1.2继承的定义格式1.3继承基类成员访问方式的变化(1)公有继承(2)保护继承(3)私有继承1.4总结2.基类和派生类对象赋值转换3.继承中的作用域1.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.2继承的定义

2021-08-11 21:23:44 180

原创 【C++】泛型编程

目录1.什么是泛型编程?2.函数模板(1)函数模板概念(2)函数模板格式(3)函数模板的原理(4)函数模板的实例化1)隐式实例化:让编译器根据实参推演模板参数的实际类型2)显式实例化:在函数名后的<>中指定模板参数的实际类型(5)模板参数的匹配原则3.类模板(1)类模板的定义格式(2)类模板的实例化1.什么是泛型编程?比如说,我们如何实现一个通用的交换函数呢?int型、double型、char型的交换void Swap(int& left, int& right){ i

2021-08-10 19:50:16 190

原创 【C++】动态内存管理

目录1.C/C++程序地址空间2.C语言动态内存管理(1)malloc(2)calloc(3)realloc3.C++动态内存管理二级目录三级目录1.C/C++程序地址空间计算机物理内存的大小是固定的,在32位系统上,地址空间可达4G(2^32),这4G按照3:1的比例分配给用户进程和内核。程序地址空间的构成:从上往下依次是:内核空间、栈区、共享区、堆区、未初始化数据区、初始化数据区、代码区。而动态内存管理所申请的空间都是在堆区,在堆区动态开辟的空间都需要我们手动去释放它,否则会造成内存泄漏。内核空间

2021-08-10 13:53:02 104

原创 【STL】String详解

目录1.头文件:#include < string >2.string的定义及初始化练习代码3.string类对象的容量操作总结练习代码3.string类对象的访问及遍历操作三种遍历方法4.string类对象的修改操作练习代码总结1.头文件:#include < string >2.string的定义及初始化1)string s1; //默认构造函数,s1为空串 cin>>s1; //写入有效字符到遇到空格2)string s2(“abc

2021-08-07 13:40:42 165

转载 【C++】迭代器 iterator

目录1.迭代器分类1) 正向迭代器2) 常量正向迭代器3) 反向迭代器4) 常量反向迭代器2.迭代器用法示例3.迭代器:++it 与 it++ 哪个好?4.迭代器的功能分类5.迭代器的辅助函数1.迭代器分类要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。迭代器按照定义方式分成以下四种。1) 正向迭代器定义:容器类名:

2021-08-06 19:54:14 197

原创 【C++】指针与引用的区别

指针和引用的区别:相同点:(1)效率差不多(2) 在传参时可以达到相同的效果,即修改形参都可以改变外部的实参(3) 在底层实现方式上是一样的,引用实际就是按照指针的方式来实现的不同点:(1)指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名。(2)指针可以有多级,引用只有一级。(3)指针可以为空,引用不能为空(4)引用在定义时必须初始化,指针没有要求(5)引用在初始化之后就不能再引用其他实体,而指针可以重新指向别的变量(6)sizeof引用得到的是引用

2021-08-06 16:15:36 169

原创 【计算机网络】三次握手和四次挥手

三次握手SYN表示建立连接,FIN表示关闭连接,ACK表示响应,三次握手就是建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的主要作用就是为了确认双方的发送和接受能力是否正常、并指定自己的初始化序列号为后面的可靠性传输做准备。初始状态:客户端处于关闭状态,服务器处于监听状态。第一次握手:客户端发送请求报文将同步序列号SYN=1和初始化序列号seq=x发送给服务器,发送完之后客户端处于发送等待状态。第二次握手:服务器收到客户端的SYN报文之后,会以自己的同步序列号SYN=1、初

2021-08-06 11:29:29 100

原创 【C++】合并二叉树

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:思路1.确定递归函数的参数和返回值:首先那么要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。代码如下:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)2

2021-08-04 22:21:23 980

原创 【C++】二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 :给定二叉树返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。思路求左右孩子深度的和的最大值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *ri

2021-08-04 22:04:54 349

原创 【C++】汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。示例 1:输入:x = 1, y = 4输出:2解释:示例 2:输入:x = 3, y = 1输出:1思路可以发现汉明距离实际上就是求 “比特位不同的值的数量,因此我们可以用异或的性质!!!”x ^ y 返回的值中比特位为 1 的地方说明 xx 与 yy 在改比特位的值不同。因此题目可以转化为:“求 x ^ y 中 1 的数量!”如何计算 x ^ y 中

2021-08-04 20:25:02 432

原创 【C++】找到数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。示例 1:输入:nums = [4,3,2,7,8,2,3,1]输出:[5,6]示例 2:输入:nums = [1,1]输出:[2]思路1.将数组元素存放到元素减1的索引位置,并对原来的数组元素加len(len为数组长度)2.遍历加len后的数组,若数组元素值小于等于n,则说明数组下标值不存在,即消失的数字

2021-08-04 20:20:36 746

原创 【C++】

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。class Solution {public: void moveZeroes(vector<int>& nums) { int slowIndex=0; for(int fastIndex=0;fastIn

2021-08-04 14:53:34 242

原创 【C++】回文链表

请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true思路1.用快慢指针,快指针有两步,慢指针走一步,快指针遇到终止位置时,慢指针就在链表中间位置2.同时用pre记录慢指针指向节点的前一个节点,用来分割链表3.将链表分为前后均等两部分,如果链表长度是奇数,那么后半部分多一个节点4.将后半部分反转 ,得cur2,前半部分为cur15.按照cur1的长度,一次比较cur1和cur2的节点数值

2021-08-03 22:43:17 169

原创 【C++】翻转二叉树

翻转一棵二叉树。示例:输入:输出:递归思路只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果1.确定递归函数的参数和返回值参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*。TreeNode* invertTree(TreeNode* root)2.确定终止条件当前

2021-08-03 17:15:29 766

原创 【C++】反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]双指针思路首先判断链表是否为空,为空则返回nullptr。接下来定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点

2021-08-03 11:24:47 177

原创 【C++】多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2投票法摩尔投票法,投我++,不投–,超过一半以上的人投我,那我稳赢哇 class Solution {public: int majorityElement(vector<int>& nums) { int count = 1; i

2021-08-03 10:38:09 308

原创 【C++】相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。思路简单来说,就是求两个链表交点节点的 指针。 这里同学们要注意,交点不是数值相等,而是指针相等。为了方便举例,假设节点元素数值相等,则节点指针相等。看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:此时我们就可以比较curA和

2021-08-02 17:49:14 181

原创 【C++】最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,

2021-08-02 17:13:44 330

原创 【C++】链表判环

给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部

2021-08-02 10:58:44 404

原创 【C++】买卖股票的最佳时机

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

2021-08-02 10:01:29 161

原创 【C++】二叉树的最大深度

给定一个二叉树,找出其最大深度。示例:给定二叉树 [3,9,20,null,null,15,7]返回它的最大深度 3 。递归法1.确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。代码如下:int getDepth(TreeNode* node)2.确定终止条件:如果为空节点的话,就返回0,表示高度为0。代码如下:if (node == NULL) return 0;3.确定单层递归的逻辑:先求它的左子树的深度,再求的右子树的深度,最

2021-07-31 11:24:06 714

原创 【C++】前序遍历、中序遍历、后序遍历、层序遍历

二叉树深度优先遍历:前序遍历、中序遍历、后序遍历二叉树广度优先遍历:层序遍历二叉树的遍历规则:前序遍历:5 4 1 2 6 7 8中序遍历:1 4 2 5 7 6 8后序遍历:1 2 4 7 8 6 5层序遍历:以下以前序遍历为例:1.确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入vector在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:void traversal(TreeNode* cu

2021-07-31 09:13:19 1912

原创 【C++】爬楼梯(青蛙跳台阶)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶递归解法class Solution { public int climbStair

2021-07-30 11:30:08 1160

原创 【C++】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]思路可以简单理解为: 同时遍历两个链表, 当前遍历的结点,谁的结点小,就把谁的结点“摘下来”,“安装”在新链表上就可以了吧。这里为了简单方便的处理, 给新链表先“安装”一

2021-07-29 13:10:30 509

原创 【C++】四数之和

思路四数之和和三数之和是一个思路,都是使用双指针法, 基本解法就是在三数之和 的基础上再套一层for循环。但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下表作为双指针,找出nums[k] + nums[i] + nums[

2021-07-29 09:59:41 694

原创 【C++】两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。思路:std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并

2021-07-29 09:57:21 1235

原创 【C++】有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:①左括号必须用相同类型的右括号闭合。②左括号必须以正确的顺序闭合。思路括号匹配是使用栈解决的经典问题。根据栈的后进后出原则,遇到左括号,直接压栈左括号相反的右括号,遇到相应的右括号,弹栈右括号(相当于一加一减操作)第一种情况,字符串里左方向的括号多余了 ,所以不匹配。第二种情况,括号没有多余,但是 括号的类型没有匹配上。第三种情况,字符串里右方向的括号多余了,所以不匹配。

2021-07-28 15:57:12 594

原创 【C++】三数之和

continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。在for循环中,遇到continue后,跳过循环体中余下的语句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for循环是否执行。...

2021-07-28 00:04:25 883

原创 【C++】有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false方法一:t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 ss 和 tt 分别排序,看排序后的字符串是否相等即可判断。此外,如果 ss 和 tt 的

2021-07-27 20:33:23 710

原创 【C++】两数之和

class Solution{public: vector<int> TwoSum(vector<int>&nums, int target) { int n = nums.size; for (int i = 0; i < n - 1; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) return{ i, j };

2021-07-27 20:32:52 1934

原创 【Linux】编译器gcc/g++、调试器gdb、项目自动化构建工具make/Makefile、git

这里写目录标题-gcc/g++预处理、编译、汇编、链接函数库gcc选项-gdb-gcc/g++预处理、编译、汇编、链接Linux gcc生成可执行程序的4个步骤: 预处理、编译、汇编、链接gcc如何完成?格式: gcc [选项] 要编译的文件 [选项] [目标文件]1.预处理(进行宏替换)预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。实例: gcc –E hello.c –o hello.i选项“-E”,该选项的作用是让 gcc 在预处理结束后停

2021-07-15 19:09:34 244

原创 【C++】# pragma once 与 # ifndef

1.# pragma once这个宏有什么作用?为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。2.两者的使用方式有何区别?示例代码如下:方式一:# ifndef __SOMEFILE_H__# define __SOMEFILE_H__ ... ... // 声明、定义语句# endif方式二:#

2021-07-14 22:10:36 125

原创 【C++】struct与typedef struct

struct 与 typedef struct1. ctypedef的作用struct 与 typedef struct 的区别标准形式2. c++1. ctypedef的作用typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。  typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。  在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新

2021-07-14 22:09:30 192

原创 【C++】什么是头文件?【.c文件和.h文件】

通常,在一个C程序中,只包含两类文件——.c文件和.h文件。C支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.c文件里。.c文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。所谓的头文件,其实它的内容跟.c文件中的内容是一样的,都是C的源代码。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个.c源文件需要它们

2021-07-14 22:08:54 1739 1

原创 【Linux】yum 包管理器 与 vim 编辑器

Linux1. 软件包管理器yum1.1 罗列软件包1.2 查找软件包1.3 安装软件1.4 删除软件2. 文件传输2.1 rzsz2.2 xftp3. vim - 编辑器3.1 vim的基本概念3.2 vim的基本操作3.2.1 进入vim3.2.2 模式切换3.2.3 vim正常模式命令集(1)移动光标(2)删除(3)复制与粘贴(4)替换(5)撤销(6)更改(7)跳动3.2.3 vim底行模式命令集(1)搜索(2)查找(3)显示行号若有错误,请大家多多指正!谢谢大家!1. 软件包管理器yum在讲 v

2021-05-29 21:41:01 1053 30

原创 【Linux】权限管理

Linux 权限1.切换用户2.访问权限和文件类型(1)文件访问者的分类:(2)权限分类(3)文件类型3.用户更改文件或者文件夹的权限(1)用户 +/- 字符权限的方式(2)8进制数字的更改方式4.权限对于文件或者文件夹的影响(1)文件(2)文件夹(3)root用户5.更改所属用户或者所属用户组(1)更改用户所有者(2)更改用户所属组若有错误,请大家多多指正!谢谢大家!1.切换用户Linux下有两种用户:超级用户(root)、普通用户超级用户:可以在linux系统下做任何事情,不受限制。普通用户:

2021-05-27 14:54:33 209 2

空空如也

空空如也

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

TA关注的人

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