自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 问答 (1)
  • 收藏
  • 关注

原创 Window对象

为解决这个问题,利用多核 CPU 的计算能力,HTML5提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程。history (历史)是对象,主要管理历史记录, 该对象与浏览器地址栏的操作相对应,如前进、后退等。表单提交后,表单中(各个元素必须有name名)所填信息会在url中的问号后方显示。window对象的相关属性都属于window,但都可以省略window。和间歇函数一样,都是window中的函数,平时会省略window。作为window类型的对象,可以省略window。

2025-08-08 11:01:18 958

原创 DOM节点操作

*追加节点 ** 如果想在界面中看到,必须要插入到界面中去。**给元素内部添加/修改文本)等操作来修改节点及节点内容。创造出一个 新的网页元素,再把该元素放入指定的元素内部。DOM节点的增删改查主要是针对于元素节点。根据结点关系查找对象:父子节点/兄弟节点。属性值: 子元素.parentNode。返回最近一级的父节点,找不到返回null。在js原生DOM操作中,要删除一个元素。复制一个原有节点并放入指定元素内部。DOM树里每一个内容都被称为节点。利用DOM操作对象内容(如**

2025-08-08 10:58:44 429

原创 JS事件流

当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。,包括自身设置的宽高、padding、border,如果盒子是隐藏的,那么获取的结果将会是0。由于事件冒泡是默认存在的,子元素的事件可能会意外触发父元素的相同事件,导致不必要的影响。我们给多个元素注册事件(比如一堆小li),原来用的是for循环,现在可以用事件委托一步到位。获取元素自己定位父级元素的左、上的距离(会算上元素的外边距等),注意这个值。简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的同名事件。

2025-07-25 16:02:36 945

原创 JS事件基础

/既实现了“只要有一个子项取消,全选取消”,也实现了“所有子项都手动勾选上后,全选会自动被勾上”。//如果有任意一个 checked == false,就设置 checkAll.checked = false。结合 DOM 使用事件时,需要为 DOM 对象添加事件监听,检测到事件发生(被触发)时,便立即调用一个函数。//既实现了“勾选全选 -> 勾选所有项”,也实现了“取消全选 -> 取消所有项”。////如果是,那就设置 checkAll.checked = true;以前的方法:采用赋值的形式。

2025-07-24 22:19:58 875

原创 基于本地数据存储的简单学生信息表

@jarringslee学生信息表的简单实现即对量化数据做出的增删改查和有效存储,利用js等前端开发语言,我们可以在浏览器中对少量数据进行持久化存储。其中js是实现数据交互与存储的核心,当然也要用到html和css对页面进行简单布局和美化。表单、表格的制作与交互用html制作表单,要注意类(class)和名(name)等属性的命名和使用,以确保正确地绑定后端事件。渲染数据将用户输入和浏览器存储的数据渲染到表格页面中是实现信息表的关键操作。整体逻辑不是很复杂,但是需要封装函数因为在删除数据、新增数据时都需要重

2025-07-24 14:55:10 884

原创 JavaScript基础语法和简单数据结构

@jarringsleejs是一种在客户端(浏览器)运行的编程语言,可实现人机交互的效果。js组成:js由两部分组成:js书写位置:**行内js:**略。**内部js:**直接写在html文件中(通常写在标签上面),用标签包裹住**外部js:**通过link链接js结束符:可以用分号结尾,也可以不写,统一格式即可。输入和输出语法:输出语法向body内输出内容:document是文档的意思,输出内容也可以用标签包裹。页面弹出警示框:控制台输出(用户无法看到,在控制到console中):

2025-07-19 21:25:19 840

原创 DOM 文档对象模型

我们通过DOM和BOM用js来操作html。之前所学的alert和prompt属于BOM的操作。html标签、css选择器获取过来就被称为dom对象查找、获取DOM对象(常用 重点)通过CSS选择器获取DOM元素选择匹配的第一个元素 只选一个!返回这个css选择器搭配的第一个元素,即一个HTMLElement对象如果没有找到,返回null获取后直接修改css值:选择匹配的多个元素:返回所有符合条件的元素(哪怕只有一个)并集合成一个NodeList 对象集合(伪数组/类数组)。选择所有元素:获

2025-07-18 20:18:41 818

原创 JS 数据类型:概念、异同、常量转换原理

值直接为undefined。在不声明变量、不赋值的情况下默认值为undefined。一般不直接把某个变量赋值为undefined。

2025-07-18 09:09:06 732

原创 js对象简介、内置对象

@jarringslee对象(object)是js的一种引用数据类型,是一种无序的数据集合“ul”(类比于数组,有序的数据集合“ol”)。基本上等于结构体。对象的声明对象中的元素一般由属性和方法组成属性:对象的信息、特征。一般为名词性的键值对(),多个键值对之间用逗号分隔。属性就是依附在对象上的变量(门面是变量,对象内就是属性)。属性名可以用单、双引号包裹(一般情况下省略),除非遇到特殊符号如空格、中横线作为属性名时。方法:对象的功能、行为。 对象的增删改查查找、访问元素 或者 (中括号

2025-07-17 22:13:06 1075

原创 js函数简介、逻辑中断和布尔类型转换

利用导函数的地方是补零机制。其实也可以把整个判断秒数并补零的结构封装成一个函数将用户输入的秒数作为实参传入(注意改为数字类型),直接在函数中输出即可。显示转换:字符串中空字符串‘’、数字类型中0、undefined、false、NaN转换为布尔值都是false,其余为true。避免全局变量之间的污染,可以在自己的局部变量内使用全局变量用过的变量名。如果函数中参数运算时有undefined,那么结果将为NaN。具名函数就是普通的有名字的函数。如果前面有被判定为假的语句,则直接中断,不会再看后面。

2025-07-16 20:31:47 435

原创 js分支语句和循环语句

变量等值多选一,switch 比 if-else 更清爽;记得 break 防穿透,default 兜底别忘掉。固定的两层for循环。如果所有 case 都不匹配且没有 default,就什么都不做。break “炸” 整个循环,continue “跳过” 这一回。和C语言冒泡排序基本相同,在数组的声明上略微有些不同。——把同一个变量/表达式的不同取值,一一对照执行。只判断一次,条件为真就执行,为假直接跳过。明确循环次数用for,不明确用while。条件为真执行 A,否则执行 B。,不会自动类型转换。

2025-07-15 21:38:16 878

原创 js运算符

两者区别:在一行运算中,++i先给自身加完之后再参与运算,i++先参与运算之后在自加。前置和后置:++i和i++:一般情况下习惯使用后置i++,两者在单独使用时没有区别。比较结果为boolean类型的值(只有true或者false)对变量进行赋值的运算符,用于简化代码。左边是容器,右边是值。不做任何类型转换,只要类型不同就直接返回。赋值运算符 = += -=隐式转换下,常常会有。

2025-07-15 21:26:51 309

原创 JavaScript书写基础和基本数据类型

@jarringsleejs是一种在客户端(浏览器)运行的编程语言,可实现人机交互的效果。js组成:js由两部分组成:js书写位置:行内js内部js直接写在html文件中(通常写在标签上面),用标签包裹住外部js通过link链接js结束符:可以用分号结尾,也可以不写,统一格式即可。输入和输出语法:输出语法向body内输出内容:document是文档的意思,输出内容也可以用标签包裹。页面弹出警示框:控制台输出(用户无法看到,在控制到console中):输入语法显示对话框和文字信息

2025-07-14 22:02:10 641

原创 移动应用开发实验室web组大一下期末考核题解

@jarringslee浮动是可以让块元素水平排列的属性,在网页开发中很常用,但是浮动最大特点就是浮动的元素会脱标(脱离标准流的控制),不再占用标准流的位置。如果下面有标准流元素就会重叠上来。而且,如果某个父级元素的子级元素是浮动元素,若父级元素高度为0(即产生塌陷问题),也会脱标,下面的元素会重叠上来,影响布局效果。所以在实际开发过程当中,我们一般都会清除浮动。下面是几种常见的清除浮动的方法:额外标签法在父元素内容的最后添加一个空的块级元素(如div或p),设置CSS属性: (专门用来清除浮动的属性,分别

2025-06-15 15:58:15 889

原创 CSS高级技巧及新增属性

​ 解决方法:设置盒子margin值为负值(边框宽度为1px,那就设值为-1px),边框就会重合,看起来更美观。为减少 HTTP 请求(减少服务器接受和发送请求的次数),加快页面加载速度,在部分场景下优化图片切换效果,出现CSS精灵技术(也称CSS Sprites、CSS雪碧)同时,需要严格控制盒子高度。也称视距(模拟人眼到屏幕的距离),在二维平面产生近大远小的视觉立体效果,单位为像素,数值越大,成像越小。任意相邻两个边框给不一样的值,其余两个边框为0,只保留其中一个赋了值的边框的颜色,另外一个边框透明。

2025-06-08 17:37:41 1038

原创 Flex 布局基础

Flex 布局,即弹性盒子布局,是一种用于在页面上排列元素的一维布局模型。它允许子元素在主轴(row 或 column)上伸缩,以填充剩余空间或适应容器的大小变化,从而解决了传统布局中的一些常见问题,如元素对齐和空间分配等。以上代码实现了一个简单的两列布局页面,左侧为导航栏,右侧为内容区,通过 Flex 布局实现了灵活的空间分配和对齐。在 Flex 布局中,我们有两个关键的概念:Flex 容器和 Flex 项目。属性决定了 Flex 项目的排列顺序,其取值为一个整数,数值越小,项目越靠前。

2025-06-02 16:47:12 895

原创 盒子模型与页面布局基础

子元素若有间距:只需设置每个元素的右边距padding-right,然后用标签清楚最后一个子元素的右边距即可。指标签在页面中的默认排布规则,如,块元素独占一行,行内元素一行可以显示多个。(专门用来清除浮动的属性,分别是清除所有 / 左侧 / 右侧浮动的属性,直接用both就行)给行内元素添(如span)加内外边距margin和padding,只能改变元素水平位置,原理:浏览器自动识别当前窗口宽度,减去盒子宽度除以二并分配给左右外边距。**多值写法:**和padding相似,值用空格隔开。

2025-06-02 16:36:24 622

原创 CSS布局(上):浮动基础

本文介绍了CSS浮动布局的基础知识,主要包括浮动原理、语法、常见属性和优缺点。浮动布局是一种传统技术,通过float属性控制元素左右浮动实现水平排列。文章分析了浮动脱离文档流和父元素塌陷问题,并提供了四种清除浮动的方法:额外标签法、单/双伪元素法和overflow属性。最后通过一个两列布局案例,展示了如何运用浮动创建侧边栏和主内容区,并解决相关的浮动问题。浮动布局虽然简单兼容性好,但相比现代布局技术不够灵活,适合传统多列布局需求。

2025-05-25 12:19:35 1001

原创 盒子模型、Flexbox 与 Grid 布局的综合运用

在前端开发中,CSS 布局是构建网页结构的核心技术之一。对于我们初学者来说,理解盒子模型、Flexbox 和 Grid 布局的原理与应用,是掌握静态页面设计的关键。

2025-05-21 19:16:11 794

原创 HTML基础

HTML(超文本标记语言)是用于创建网页的标准标记语言。本文介绍了HTML的基础知识,包括VS Code编辑器的快捷操作、HTML标签的使用、文件路径的查找方法以及列表的创建。

2025-05-18 16:57:13 901

原创 HTML难点小记:一些简单标签的使用逻辑和实用化

自定义验证消息可以通过。

2025-05-11 13:30:19 957

原创 数据结构小扫尾——栈

线性表是一种最基础的数据结构,它由具有相同特性的数据元素构成,这些数据元素之间存在着线性关系,即第一个元素称为表头,最后一个元素称为表尾,除第一个元素外,每个元素有且只有一个前驱,除最后一个元素外,每个元素有且只有一个后继。线性表可以顺序存储,也可以链式存储。栈是一种特殊的线性表,它满足后进先出的特性,即最后被插入的元素最先被删除。栈的插入和删除操作都只能在栈顶进行。就像一个桶。我们把东西按顺序放进去,最后一个就放在了桶的最顶端。我们需要拿出来的时候,先拿出来最后放进去的,最后拿出来第一个放进去的。

2025-05-05 17:04:20 1220

原创 240428 leetcode exercises

由于我们无法开一个新数组,我们可以先for循环遍历一遍,利用三个整型变量存储下每个元素出现的次数,再利用三个for循环遍历修改数组。这样,无需第三个指针去专门处理2,剩下的元素最终都是2,从而实现了三色排序的线性、原地、一次遍历完成。都在往右扫,已处理的元素都被移动到它们正确的区间:0 一定被放到最左边,1紧跟其后,2则自然留在遍历者。把前一段(或哑节点)接到这一组的头部,再把prev移动到当前组的尾部(即刚才的。我们把数组分成三段(0的区间、1 的区间、未处理区间)并在一次遍历中完成原地排序。

2025-04-28 12:03:03 1139

原创 what is 堆

二叉树是一种树数据结构,它最多有两个子节点,分别称为左子节点和右子节点。二叉树可以是空树,也可以由一个根节点和两棵互不相交的左子树和右子树组成。堆是一种特殊的完全二叉树,它满足堆的性质:每个父节点的值都大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。大顶堆中父节点的值总是大于或等于子节点的值,而小顶堆则相反。

2025-04-27 17:40:18 810

原创 移动应用开发实验室web组大一下第一次考核题解

接下来建立循环比较两链表当前节点值的大小,如果list1当前值较小,那就取这个节点递归给list1下一个节点值和list2当前节点值的函数。先建立新的空节点指向第一个链表list[0](刚才已经排除了一个都没有的情况),再建立循环,合并当前新建好的的链表和链表数组中的下一个链表,注意。​ 再次进入判断:如果val值等于当前结点的下一个节点的值,那么删除该节点,并让当前节点移动至下一个节点,直到下一个节点的值不等于val值。第一次遍历时直接开始比较的当前节点的下一个节点正是给出链表的头结点)。

2025-04-27 16:57:17 1057

原创 240427 leetcode exercises

但是题目只想让我们找到那个特定的数字,并没有要求我们进行排序。这样我们既完成了“计数排序”的准备工作,还知道了数据中的最大元素,后续无需每次都从下标 20000 向前搜。题目要求返回第k个最大的数字,就是数组排序后的倒数第k个数字。从最大值对应的桶开始向小的方向(桶下标依次减 1)走,用一个变量。,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。,通过某种方式记录下来之后再返回,肯定比排序的复杂度要低很多。随后便可以直接返回要找的第k大的数字。,此时对应的元素就是第 k 大。

2025-04-27 14:11:06 437

原创 240426 leetcode exercises

还是一道练增删改查基本功的题。让你把第一个链表从某两点断开并删除中间节点,并拼上新的链表。用正常的思路就能解决:​ 我们首先找到结点和的具体位置并保存。因为要从第a个结点开始删除。所以我们让指针走向第个结点。b的话因为我们后面会直接拼上节点的指针,即第个结点。所以正常遍历就好。接下来让保存好的结点接上。最后让让遍历到list2的尾结点的指针拼上刚才找到结点b的指针。返回list1。🔁进阶版 一遍到位,直接拼接 一开始指向 ,负责走到第 a-1 个节点。 同时指向 ,负

2025-04-26 21:29:16 1086

原创 240425 leetcode exercises

初始时,已排序部分只包含链表的第一个节点,其余节点组成未排序部分。我们逐个从未排序部分取出节点,插入到已排序部分的正确位置,直到未排序部分为空。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。在数组中,插入和移动元素可能涉及大量的数据移动,而在链表中,只需调整指针即可完成插入操作,因此插入排序在链表中更为高效。为了简化插入操作,特别是在头部插入的情况,我们引入一个虚拟头节点。个节点的值后,返回链表的头节点(链表。次,从而指向第 k 个节点。指针指向原链表的头节点。

2025-04-26 00:16:07 850

原创 240424 leetcode exercises II

首先用快慢指针找到链表中点,将链表从中点一分为二,然后对左右两段递归排序,最后再利用合并两个升序链表的知识将两个已排序的链表合并成一个有序链表。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。经典的递归合并:比较两个链表头节点,值小的那个接上后面继续合并。p2指向头结点的next指针(也就是p1的下一个节点),​ 总体而言就是合并链表、查找链表思路的综合应用。

2025-04-24 22:56:54 907

原创 240423 leetcode exercises

要么更直接就是滑动窗口,维护一个乘积,只要它大于等于 k 就把左指针右移、除掉旧元素,保证窗口内乘积始终小于 k,这样每个数字只进出窗口一次,O(n) 秒解。​ 本题在此基础上对数组进行了有序旋转,旋转后我们需要先判断哪一半(左侧或右侧)是有序的,或者先找到“折叠点”(最小值),再在对应子区间中二分。做一次二分,找到“从末尾看,第一个比末尾大的元素位置”——也就是旋转前的最后一个元素位置,再加 1 就是最小值下标。,让你在这个“折叠”后的数组里,仍然用对数时间找到。,在它之内如果有解,我们始终不把它丢掉。

2025-04-23 11:56:49 717 1

原创 240422 leetcode exercises

​ 但是题目又说, “当 t 很长、要对它执行大量(10亿)子序列判断查询”,在这种变态情况下,我们想刚才那样愚蠢地遍历好像是有点笨拙了。​ 题目要求我们的函数被调用后输出整个链表,而我们又注意到所写函数是void类型,所以我们只需要执行删除该节点的操作即可。——等价于把原来的 B 节点直接「搬到」A 的位置,然后把原 B 节点从链表里跳过去了。​ 他是想说什么意思呢,就是在不给你整个链表的情况下,让你根据这个值来将这个节点删除。到当前节点,再跳过后继,实现了在不知道前驱的情况下删除节点的目标。

2025-04-21 22:41:25 906

原创 240421 leetcode exercises

字典序(Lexicographical Order)就是把序列(比如字符串、数组、单词序列等)当成“字典里的一行行词条”来排序,遵循人们查字典时的顺序习惯。逐位比较如果在第 k位上,A[k]<B[k],那么 A 在字典序中就排在 BB之前;如果 A[k]>B[k,则 A排在 B之后;如果 A[k]=B[k],继续比较下一位,直到遇到不相等的位置或其中一个序列结束。前缀规则如果一个序列是另一个序列的前缀,比如。

2025-04-21 15:45:45 806

原创 C语言动态规划理论基础和基本实现

在动态规划的思路中,我们通常需要定义一个状态来表示问题的某个阶段的最优解。在这个问题中,我们定义dp[i]表示偷到第 i 家时,前 i+1 家中的最大可偷金额。这里 i 的取值范围是从 0 到 n-1,其中 n 是数组的长度。

2025-04-20 05:35:50 967

原创 240420 leetcode exercises

​ 我们将链表的所有节点值依次读入一个数组中。利用数组下标,我们就可以方便地用两个指针从两端向中间移动,判断是否对称。这是一个巧妙的递归方法,模拟双指针的对撞过程,用系统栈来保存“从右向左”的指针(递归栈),同时用一个全局指针。虽然不用数组了,但依然使用了系统递归栈,不是真正意义上的 O(1) 空间。的节点一个个“摘下来”,添加到新链表中,同时将它们从原链表中删除。一直递归到链表尾部,再逐层返回(即从尾往头回溯)。,请你判断该链表是否为回文链表。提取出来组成另一个子链表 B。提取出来组成一个子链表 A,

2025-04-20 04:50:12 804

原创 240418 leetcode exercises

记给定链表的长度为 n,注意到当向右移动的次数 k≥n 时,我们仅需要向右移动 kmodn 次即可。这样我们可以知道,新链表的最后一个节点为原链表的第 (n−1)−(kmodn) 个节点(从 0 开始计数)。​ 在两数之和中,我们两重循环枚举的方法放在这里肯定会超时,而当时的快慢指针是分别从头和尾开始,如果两数之和比目标值大那就左移快指针减小数值,反之则慢指针右移,直到找到正确的数字。我们参照两数之和相向双指针的方法,通过枚举一个数、双指针处理另外两个数来解决三数之和。,旋转链表,将链表每个节点向右移动。

2025-04-20 04:08:28 1002

原创 240419 leetcode exercises

快指针先出发,直到遍历到第n个结点的时候慢指针以同样的速度出发,这样快慢指针之间永远间隔了n−1个节点,即超前了n个节点。​ 本质思想仍然是“谁小谁先接”,通过递归不断比较当前两个链表的头结点值,较小的那个继续和另一个链表递归合并,直到某个链表为空,返回另一个链表作为终点。每一步我们都比较两个链表当前节点的值,较小的接入新链表,然后对应链表向后移动一格。​ 遍历结束后,剩余链表(必定是有序的)可以直接接到新链表末尾。步,找到要删除节点的“前一个节点”,让这个“前一个节点”的。个结点,并且返回链表的头结点。

2025-04-19 21:37:11 833

原创 双指针的高级应用与综合问题

双指针技术不仅是处理数组和链表的基础工具,它在解决更复杂的问题时也展现出了强大的威力。通过与排序、哈希表等技术结合,双指针能够帮助我们高效地解决诸如三数之和、最小覆盖子串等问题。而中心扩展法作为一种常见的技巧,也可以利用双指针思想解决回文子串等问题。实际应用场景大数据处理:双指针技术常用于处理大规模数据集,例如在搜索引擎中快速定位符合条件的子串。字符串分析:在文本处理中,双指针技术可以高效地解决回文子串、最小覆盖子串等问题。算法优化:通过双指针优化时间复杂度,减少不必要的计算,提升算法效率。

2025-04-13 17:51:02 815

原创 移动应用开发实验室2024二面纳新题复盘

这是因为每个灯被操作的次数等于它的因数的个数,而只有平方数的因数个数是奇数。我们首先读取阈值n和两条DNA序列,然后遍历两条DNA序列的每个位置并统计相同碱基对的数量,最后计算相同碱基对占总碱基对数量的比例。题目要求我们检查由给定的大小为n数组的相邻各个元素之间的差值组成的新数组,如果刚好是1到n-1那么就符合条件。为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的 DNA 进行比对,以判断该比对的 DNA 是否具有相关性。的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。

2025-04-06 18:22:03 887 2

原创 二叉树进阶II :高级の树。

被删除节点有两个子节点,需要找到其右子树中的最小值节点(或者左子树中的最大值节点),用该节点的值替换被删除节点的值,然后删除该最小值节点。然后,不断从优先队列中取出频率最小的两个节点,创建一个新的内部节点,其频率为这两个节点频率之和,并将这两个节点作为新节点的左右子节点;如果目标值大于当前节点的值,则继续在右子树中查找。二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,其特点是对于每个节点来说,其左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。

2025-03-29 13:51:10 362

原创 二叉树进阶:从基础到应用的深度求索

遇到运算符时,弹出栈顶的两个节点作为该运算符节点的左右子节点(注意顺序,先弹出的是右子节点,后弹出的是左子节点),然后将该运算符节点压入栈中。具体步骤如下:首先将根节点压入栈中,然后进入循环,每次从栈中弹出一个节点并访问它,接着先将该节点的右子节点压入栈,再将左子节点压入栈(因为栈是后进先出的,所以先压右子节点,后压左子节点,这样弹出的顺序就是先左后右)。其基本思想是,先沿着左子树一直往下走,将沿途的节点压入栈中,直到左子树为空,然后弹出栈顶节点并访问,接着转向该节点的右子树,重复上述过程。

2025-03-23 11:00:41 719

空空如也

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

TA关注的人

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