自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构与算法实战(十二)线段树,Trie和并查集

线段树,Trie和并查集线段树(区间树)Segment Tree为什么要使用线段树问题引出:区间染色问题颜色可被覆盖操作划分:染色操作(更新区间)查询操作(查询区间)使用数组实现,染色和查询都是遍历数组的操作,时间复杂度都是O(n),而线段树可以更高效。另一经典问题:区间查询对于给定区间:更新:更新区间中一个元素或者一个区间的值查询:查询一个区间[i,j]的最大值,最小值,或者区间数字和什么是线段树以求和为例,每一个节点存储的是线段和。线段树不是完全二叉树,但线

2021-01-24 16:15:59 319

原创 数据结构与算法实战(十一)希尔排序法

数据结构与算法实战(十一)希尔排序法基本思想:让数组越来越有序不能只处理相邻的逆序对实现public class ShellSort { private ShellSort(){} public static <E extends Comparable<E>> void sort(E[] data){ int h = data.length / 2; while (h >= 1){ //s

2020-11-28 10:13:57 137

原创 数据结构与算法实战(十)冒泡排序

数据结构与算法实战(十)冒泡排序原理比较两个相邻的元素,将值大的元素交换到右边思路依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。(2)比较第2和第3个数,将小数 放在前面,大数放在后面。…(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。(

2020-11-23 09:32:35 142

原创 数据结构与算法实战(九)堆与优先队列

数据结构与算法实战(九)堆与优先队列一、堆堆的基本结构使用二叉树来表示一个堆,也叫做二叉堆二叉堆是一棵完全二叉树(若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。)堆中某个节点的值总是不大于其父节点的值,这样的堆叫做最大堆(根节点最大),相应的可以定义最小堆用数组存储二叉堆索引从1开始如果索引从0开始:代码实现基础架构//数组实现二叉堆public class Ma

2020-11-18 10:21:55 118

原创 数据结构与算法实战(八)二分搜索树

数据结构与算法实战(八)二分搜索树一、树结构树结构本身是一种天然的组织结构(例如电脑中的文件夹结构)高效(将数据使用树结构存储后,出奇的高效)二分搜索树平衡二叉树:AVL;红黑树堆 ; 并查集线段树;Trie(字典树,前缀树)二、二分搜索树(一)二叉树和链表一样,是动态数据结构class Node{ E e; Node left; //左孩子 Node right; //右孩子}二叉树具有唯一根节点二叉树每个节点最多有两个孩子二叉树每个节点最

2020-11-16 12:21:58 130

原创 数据结构与算法实战(七)二分查找法

数据结构与算法实战(七)二分查找法一、二分查找法介绍对于有序数列,才能使用二分查找法二分查找法是O(logn)级别的算法而排序叫做二分查找法的前置条件,如果计算排序时间:O(n logn)应用在多次查找中使用二、递归实现二分查找法public class BinarySearch { private BinarySearch(){} /** * * @param data 数组 * @param target 目标元素 * @par

2020-11-11 12:05:29 510

原创 数据结构与算法实战(六)快速排序法

数据结构与算法实战(六)快速排序法一、原理QuickStart(arr, l, r){ if(l >= r) return; int p = partition(arr, l, r); //对arr[l, p - 1]进行排序 QuickStart(arr, l, p-1); //对arr[p + 1, r]进行排序 QuickStart(arr, p + 1, r); }二、基础的Partition实现pr

2020-11-10 15:46:09 795

原创 数据结构与算法实战(五)归并排序法

数据结构与算法实战(五)归并排序法一、原理MergeSort(arr, l, r){ if(l >= r) return; //求解最基本问题 int mid = (l + r) / 2; //将原问题转化为更小的问题 //对arr[l , mid]进行排序 MergeSort(arr , l, mid); //对arr[mid + 1 , r]进行排序 MergeSort(arr , mid + 1, r); //将a

2020-11-07 19:07:51 144

原创 数据结构与算法实战(四)动态数据结构基础:链表

数据结构与算法实战(四)动态数据结构基础:链表链表是真正的动态数据结构一、什么是链表链表结构数据存储在节点(Node)中class Node{ E e; Node next;//指向下一个结点(最后一个结点为null)}优点:真正的动态,不需要处理固定容量问题缺点:丧失了随机访问的能力数组和链表的对比数组最好用于索引有语意的情况下。最大的优点:支持快速查询链表不适合用于索引有语意的情况。最大的优点:动态二、实现链表1、实现内部Node采用内部

2020-11-04 20:56:33 210

原创 数据结构与算法实战(三)基础数据结构

数据结构与算法实战(三)基础数据结构一、数组数组最大优点:快速查询1、二次封装属于我们的数组类public class Array { private int[] data; private int size; //构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = new int[capacity]; size = 0; }

2020-11-03 18:49:27 104

原创 数据结构与算法实战(二)基础排序算法

数据结构与算法实战(二)基础排序算法包含选择排序和插入排序一、选择排序法1、算法引入先把最小的拿出来,在剩下的里面再把最小的拿出来…这个过程一直持续,每次选择还没处理的元素里最小的元素2、原地排序排序过程占用了额外的空间,而是否可以原地完成是排序算法中一个关键点。选择排序法可以原地排序3、算法思想循环不变量:arr[i…n) 未排序 arr[0…i) 已排序arr[i…n) 中的最小值要放到arr[i]的位置4、代码实现//使用泛型public class Selectio

2020-10-29 18:35:49 128

原创 数据结构与算法实战(一)线性查找

数据结构与算法实战(一)线性查找一、算法引入在一堆试卷中,找到属于自己的试卷,需要一张一张的查看,第一张:不是,第二张:不是,… 第十张:是,找到了算法输入:数组(或其他数据结构)和目标元素算法输出:目标元素所在索引;若不存在,则返回-1二、代码实现public class LinearSearch { private LinearSearch(){} //构造函数私有化,无法new一个对象 public static int search(int[] data, i

2020-10-28 21:26:00 266

原创 《深入理解Java虚拟机第三版》读书笔记(4)虚拟机执行子系统

《深入理解Java虚拟机第三版》读书笔记(4)虚拟机执行子系统代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。一、Java语言无关性Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。作为一个通用的、与机器无关的执行平台,任何其他语言的实现者都可以将Java虚拟机作为他们语言的运行基础,以Class文件作为他们产品的交付媒

2020-10-27 20:18:41 92

原创 《深入理解Java虚拟机第三版》读书笔记(3)垃圾收集与内存分配

《深入理解Java虚拟机第三版》读书笔记(3)垃圾收集与内存分配一、垃圾收集(GC)垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。(一)判断一个对象是否存活1、引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的(即可被回收)。在两个对象出现循环引用的情况下,此时引用

2020-10-27 15:10:22 153 2

原创 设计模式之工厂模式

设计模式之工厂模式工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式一、简单工厂模式1、基本介绍简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.2、应用实例需求披萨的种类很多(比如 GreekPizz、Chee

2020-10-26 21:21:05 77

原创 设计模式之单例模式

设计模式之单例模式单例模式一、基本介绍所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。二、单例模式八种方式1) 饿汉式 (静态常量)2) 饿汉式(静态代码块)3) 懒汉式(线程不安全)4) 懒汉式(线程安全,同步方法)5) 懒汉式(线程安全,同步代码块)6) 双重检查7) 静态内部类8) 枚举1、饿汉式(静态常量)

2020-10-26 19:31:03 58

原创 设计模式类型

设计模式类型设计模式分为三种类型,共 23 种创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。具体的设计模式参见专栏其他博客...

2020-10-26 17:08:37 70

原创 设计模式七大原则

设计模式七大原则设计模式的目的:​ 编写软件过程中,程序员面临着来自耦合性,内聚性,以及可维护性,可扩展性,可重用性,灵活性等多方面的挑战,设计模式是为了让程序具有更好的:代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)使程序呈现高内聚,低耦合的特性常用的七大原则:一、单一职责原则1、基本介

2020-10-26 17:01:32 165

原创 设计模式之职责链模式

设计模式之职责链模式职责链模式一、基本介绍职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。这种类型的设计模式属于行为型模式二、原理类图Handler :

2020-10-26 15:42:41 268

原创 设计模式之策略模式

设计模式之策略模式策略模式一、基本介绍策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。二、原理类图说明:从上图可以看到,客户 context 有成员变量 strategy 或者其他的策略接口,至于需要使用到哪个

2020-10-26 14:56:49 108

原创 设计模式之状态模式

设计模式之状态模式状态模式一、基本介绍状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类二、原理类图Context 类为环境角色, 用于维护 State 实例,这个实例定义当前状态State 是抽象状态角色,定义一个接口封装与 Context 的一个特点接口相关行为ConcreteState 具体

2020-10-26 10:46:34 57

原创 设计模式之解释器模式

设计模式之解释器模式解释器模式一、基本介绍在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器解释器模式(Interpreter Pattern)是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器, 使用该解释器来解释语言中的句子(表达式)应用场景应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树一些重复出现的问题可以用一

2020-10-26 09:50:04 88

原创 设计模式之备忘录模式

设计模式之备忘录模式备忘录模式一、基本介绍1) 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作

2020-10-25 20:25:28 54

原创 设计模式之中介者模式

设计模式之中介者模式中介者模式一、基本介绍中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互中介者模式属于行为型模式,使代码易于维护比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用二、原理类图Mediator 就是抽象中介者,定义了同事对象到中介者对象的

2020-10-25 19:49:08 223

原创 设计模式之观察者模式

设计模式之观察者模式观察者模式一、案例引入具体需求气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口测量数据更新时,要能实时的通知给第三方二、观察者模式1、基本介绍定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者

2020-10-25 17:03:29 62

原创 设计模式之迭代器模式

设计模式之迭代器模式迭代器模式一、基本介绍迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式如果我们的集合元素是用不同的方式实现的,有数组,还有 java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。二、原理类图Iterator

2020-10-25 14:56:44 113

原创 设计模式之访问者模式

设计模式之访问者模式访问者模式一、基本介绍访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离,解决 数据结构和操作耦合性问题访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决

2020-10-24 10:57:55 154

原创 设计模式之命令模式

设计模式之命令模式命令模式一、基本介绍命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计命令模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。在命令模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。通俗易懂

2020-10-24 09:18:34 110

原创 设计模式之模板方法模式

设计模式之模板方法模式模板方法模式一、基本介绍模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),指 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某

2020-10-23 20:41:11 91

原创 设计模式之代理模式

设计模式之代理模式代理模式一、基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。示意图:二、静态代理静

2020-10-23 19:53:34 56

原创 设计模式之享元模式

设计模式之享元模式享元模式一、基本介绍享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率享元模式经典的应用场景

2020-10-23 11:04:54 559

原创 设计模式之外观模式

typora-copy-images-to: img设计模式之外观模式外观模式一、基本介绍外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节解决多个复杂接口带来的使用困难,起到简化用户操作的作用二、原理类图外观类(Facade): 为调用端提供统一的调用接口, 外观.

2020-10-23 10:01:25 83

原创 设计模式之组合模式

设计模式之组合模式组合模式1、基本介绍组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示 “整体 - 部分” 的层次关系,允许用户以相同的方式处理单独对象和组合对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。是结构型设计模式组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象2、原理类图 Component :这是组合中对象声明接口,在适当情况下,

2020-10-23 09:14:58 52

原创 设计模式之装饰者模式

设计模式之装饰者模式一、装饰者模式1、定义动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)2、原理 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被

2020-10-20 20:49:26 79

原创 设计模式之桥接模式

设计模式之桥接模式一、桥接(Bridge)1、基本介绍桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。是一种结构型设计模式Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展2、原理类图 抽象类(Abstraction) :定义抽象类的接口,维护了

2020-10-20 19:01:03 63

原创 《深入理解Java虚拟机第三版》读书笔记(2)Java内存区域与内存溢出异常

《深入理解Java虚拟机第三版》读书笔记(2)Java内存区域与内存溢出异常Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。一、运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 1、程序计数器程序计数器(Program Counter Regist

2020-10-19 21:06:48 61

原创 《深入理解Java虚拟机第三版》读书笔记(1)走进java

《深入理解Java虚拟机第三版》读书笔记(1)走进java一、Java技术体系1、JCP官方定义的技术体系包括:Java程序设计语言各种硬件平台上的Java虚拟机实现Class文件格式Java类库API来自商业机构和开源社区的第三方Java类库注:JCP(Java Community Process) 是一个开放的国际组织,主要由JAVA开发者以及被授权者组成,职能是发展和更新。2、JDK与JRE划分Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java D

2020-10-19 21:03:14 130

原创 设计模式之适配器模式

设计模式之适配器模式一、适配器模式1、基本介绍适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式适配器可以想象为转接头,将两个不匹配的接口通过适配器进行匹配2、工作原理适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容从用户的角度看不到被适

2020-10-19 08:21:20 85

原创 设计模式之建造者模式

设计模式之建造者模式一、问题引入1、盖房项目需求需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的2、传统方式解决盖房项目1)思路分析2)代码实现抽象类AbstractHouse.javapublic abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstra

2020-10-18 16:36:18 65

原创 设计模式之原型模式

设计模式之原型模式一、问题引入克隆羊问题:​ 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10只羊。二、传统形式解决克隆羊问题1、类图分析2、代码实现Sheep类``public class Sheep { private String name; private int age; private String color; public Sheep(String name,

2020-10-17 11:08:41 387

空空如也

空空如也

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

TA关注的人

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