自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文搞懂kmp算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特一莫里斯一普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度0(m+n)[1]。区别:KMP和BF唯一不一样的地方在,我主串的i并不会回退,并且j也不会移动到0号位置。

2024-11-28 22:55:30 2269 103

原创 滑动窗口(一)

滑动窗口算法是一种优化的线性时间复杂度算法。从概念上讲,它就像是在数据序列(如数组或字符串)上有一个可以“滑动”的窗口。这个窗口大小可以固定,也可以根据条件动态变化。主要用于解决一些连续区间相关的问题,比如在一个很长的数组中寻找满足某种条件的子数组,像子数组的和大于某个值、子数组内元素的乘积小于给定值等。或者在字符串中,找最长无重复字符的子串之类的问题。其优势在于能够减少不必要的计算。

2024-11-27 01:50:20 1115 13

原创 双指针(二)双指针到底是怎么个事

解析:利用双指针和数组的单调性去解决本题。如果一个数组为[2,3,2,5,4,9,10],求有效的三角形个数,最好的做法是先排序让数组有序慢慢找规律。对于三角形来说判断三边能否构成三角形最主要的条件是:2边之和大于第三边。设a<b<c,如果要能构成三角形那么必须满足以下三个等式:等式一:a+b>c等式二:a+c>b等式三:b+c>a现在已知c为最大数,对于等式二和等式三来说,一个最大的数在加上一个正数肯定大于另外一个数。所以在已知a,b,c三者的关系后,对于等式二和三是恒成立的。

2024-11-12 01:05:54 1613 34

原创 走进算法大门---双指针问题(一)

概念:双指针是指在遍历数据结构(如数组、链表等)时使用两个指针,通过特定的移动规则来解决问题。这两个指针可以同向移动,也可以相向移动。

2024-11-09 01:42:09 2271 20

原创 JavaWeb项目-----博客系统

如果用户已登录,它会从POST请求中获取博客的标题(或者空字符串),则向客户端返回“标题或者正文为空”的提示并终止方法。首先,它会检查用户是否登录,通过获取用户会话(如果前端没有传入指定id那么展示全部内容,如果传入指定id查询指定用户博客。对象,将从请求中获取到的标题和内容以及从用户对象中获取到的用户ID设置到。最后,如果博客插入成功,将客户端重定向到。),并且对获取到的标题和内容进行验证,如果标题或者内容为空(),如果会话不存在或者从会话中获取不到代表用户的。如果用户未登录是不能跳转到博客列表的页面。

2024-11-07 01:38:09 1193 21

原创 Linux基本指令(上)

比如执行 rm -rf / (在有足够权限的情况下),这是一条非常危险的命令, -r 表示递归删除(用于删除目录及其内容), -f 表示强制删除(不提示确认), / 是根目录,这条命令会删除整个文件系统,也就是所谓的“删库”。,例如 /var/log/httpd , /var 是根目录下的一个主要目录, /var/log 是 /var 下的子目录, /var/log/httpd 则是 /var/log 下的更下一层目录。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。

2024-10-27 01:15:51 2191 34

原创 Servlet(三)-------Cookie和session

一.Cookie和SessionCookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用户的登录状态、语言偏好等信息。Cookie有一定的有效期,可以设置过期时间。Session是存储在服务器端的数据结构,用于跟踪用户的会话状态。服务器为每个用户(通常是通过用户的首次请求)创建一个Session,会给用户分配一个唯一的标识符

2024-10-24 21:50:28 1792 28

原创 Servlet(二)

一.Servlet API 详解Servlet API是一套Java编程语言的库,它提供了一种在服务器端生成动态网页内容的方式。主要用于开发服务器端应用程序,帮助开发人员处理HTTP请求并生成响应,让Web服务器能够和Java程序交互,以构建动态的Web应用。我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法。二.核心方法面试题:谈谈servlet的生命周期:init()方法在webapp被加载的时候执行,使用这个方法进行一些

2024-10-23 14:00:37 1339 22

原创 时间复杂度和空间复杂度

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2024-10-20 19:13:19 1132 23

原创 Servlet(一)

一.什么是servlet一.什么是servletServlet 是一种实现动态页面的技术。是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app。1.回顾 动态页面 vs 静态页面静态页面也就是内容始终固定的页面。即使 用户不同/时间不同/输入的参数不同 , 页面内容也不会发生变化。(除非网站的开发人员修改源代码, 否则页面内容始终不变)。对应的, 动态页面指的就是 用户不同/时间不同/输入的参数不同, 页面内容会发生变化。

2024-10-20 02:04:43 1043 12

原创 HTTP和HTTPS(二)

以后我们参加工作后, 经常会涉及到 “报销” 的场景。你拿着发票想报销, 需要领导批准。但是领导又不能和你一起去找财务。那咋办?很简单, 领导给你签个字就行了。财务见到领导的签字, “见字如见人”。因为不同的人, “签名” 的差别会很大。使用签名就可以一定程度的区分某个特定的人。类似的, 针对一段数据(比如一个字符串), 也可以通过一些特定的算法, 对这个字符串生成一个 “签名”。并保证不同的数据, 生成的 “签名” 差别很大。这样使用这样的签名就可以一定程度的区分不同的数据。

2024-10-18 00:45:52 2131 8

原创 HTTP和HTTPS(一)

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议.超文本是一种包含了链接、图像、音频、视频等多种形式的信息载体,它不仅仅是简单的文本内容。超文本通过链接将不同的信息片段连接在一起,使得用户可以通过点击链接轻松地从一个文档跳转到另一个文档,或者从一个位置跳转到同一文档中的另一个位置。例如,网页就是一种典型的超文本,其中的文字可能包含指向其他网页的链接,还可能有图片、视频等多媒体元素,这些元素共同构成了丰富的超文本内容,为用户提供了更加多样化和便捷的信息获取方式。

2024-10-17 00:26:18 1580 7

原创 构造函数,析构函数,深浅拷贝【c++】

在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。若未显式定义,编译器会生成默认的拷贝构造函数。

2024-10-12 21:58:36 1666 6

原创 AVL树----java版

/平衡因子//左孩子的引用//右子树的引用//父亲节点的引用我们需要把AVL定义为三叉树,同时增加bf记录每个节点的平衡因子,通过获取节点的平衡因子来调节树的平衡。三叉结构增加一个指针指向父亲节点,可以更好的在增加节点时修改父亲节点的平衡因子。

2024-10-12 04:19:33 982

原创 java网络原理(四)----tcp特性

滑动窗口:可以提高传输效率,准确的来说是让tcp在可靠传输的前提下,效率不要太拉胯。使用滑动窗口不能使tcp变的比UDP块,但能减少差距。前面谈过tcp的传输数据的时,会把数据进行编号,每次传固定的长度。比如主机A给主机B发信息,信息经过应用层后到传输层,tcp会把应用层发来的信息通过每个字节进行编号,假设编号为1到3000,tcp会批量传输编号内容。设主机A第一次传输编号为1到1000的内容。主机B收到给A返回确认应答后,主机A才能接着发1001到2000的数据。

2024-03-26 17:41:13 1296 1

原创 java网络原理(三)----三次握手四次挥手

三次握手是建立连接的过程,四次挥手是断开连接的过程,三次握手发生在socket.accept()之前。客户端和服务器尝试建立连接的时候服务器就会和客户端进行一系列的数据交换称为握手,这个过程建立完了后,连接就好了。A和B完成建立连接的过程需要3次打招呼的数据交互。

2024-03-22 21:55:15 732 1

原创 java网络原理(二)------TCP确认应答和超时重传

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

2024-03-22 19:54:27 1122 1

原创 java----网络编程(一)

用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。与本地打开视频文件类似,只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所有的网络资源,都是通过网络编程来进行数据传输的。网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。

2024-03-17 21:27:20 986

原创 java---网络初始

随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和广域网。局域网,即 Local Area Network,简称LAN。Local 即标识了局域网是本地,局部组建的一种私有网络。局域网内的主机之间能方便的进行网络通信,又称为内网;

2024-03-14 00:06:44 881 1

原创 java多线程面试题(三)-----HashTable,HashMap,ConcurrentHashMap

Hashtable是JAVA中依靠哈希表来实现的,学习数据结构的时候我们已经知道哈希表是基于数组加链表去实现的。哈希表最重要的是扩容机制和哈希冲突,当负载因子大于0.75时会触发扩容机制。哈希冲突是多个数通过哈希函数映射到同一位置。为了解决哈希冲突会在数组上挂一个链表,往链表上去插入元素。HashMap底层是依靠这种原理来实现的,是数组加链表加红黑树。

2024-03-12 20:02:43 945 1

原创 java多线程编程------CAS

在JDK1.之前,java的多线程都是靠synchronized来保证同步的,这会引发很多性能问题,例如死锁。但随着Java的不断完善,JNI使得java能越过JVM直接调用本地方法,例如CAS。CAS ,它用于实现多线程同步的原子指令,允许算法执行读-修改-写的操作,而无须担心其他线程同时修改变量。

2024-03-11 20:15:06 944

原创 java多线程面试题(一)

自旋锁:是轻量级锁的一种典型实现,在用户态下,通过自旋的方式(while循环),实现类似于加锁的效果。挂起等待锁:是重量级锁的一种典型实现,通过内核态,借助系统提供的锁机制,当出现锁冲突的时候,会牵扯到内核对于线程的调度,使线程出现挂起(阻塞等待)。自旋锁相当于追女孩子时,发现追的女孩子有男朋友了(锁被占用了),任然每天给这个女孩子发早安晚安,这样就可以在她分手的第一时间发现,并且抓住机会。这种锁会消耗一定的cpu资源,但是可以最快拿到锁。

2024-03-07 16:02:16 955

原创 java多线程编程(四)-----线程池

java中的池是非常重要的思想方法,比如内存池,进程池,连接池,常量池等等。本篇重点介绍java中的线程池。这里的这些池的概念都是一样的,比如做饭的时候,有烧水,切菜,炒菜等流程,如果等水烧开再去炒菜,切菜效率会很慢,但是可以烧水的同时去切菜,炒菜,效率大幅提升。如果我们需要频繁的创造和销毁线程,此时创建和销毁线程的成本就不能忽视了,因此可以使用线程池。提前创建好一波线程,后续需要用线程只需要从线程池中拿,线程用完后继续放到池子里面。思考一下为什么从池子里面取,就比从系统中创建线程更快更高效呢?

2024-03-05 19:30:23 862 1

原创 java多线程编程(三)----生产者消费者模型

front说明队列为空。放入元素的时候先判满,满了不能放,然后tail位置上放入元素,让tail走到下一个位置。比如第一次0号下标放入“hello”注意一定不能写tail++,队列元素已满的时候,再次++会越界,加1取模会让tail在次回到头节点,从而循环起来。同理删除元素也让头节点++。注意也不能直接++,必须取模,其条件为 front = (front + 1) % length;有了前置知识,那么我们首先实现一个循环队列。

2024-03-03 12:26:37 1214

原创 java多线程编程(二)----单例模式

单例模式是一种设计模式,就比如下棋的时候对于高手来说,每个人都会很多种棋谱,在比赛中按照棋谱的套路灵活应用,见招拆招。java中的设计模式就和棋谱一样,程序员按照棋谱来写代码能够保证下限。设计模式有很多种,之前有个大佬写了一本书有23种设计模式,不同的语言有不同的设计模式。对于新手来说最主要的是理解2种设计模式,单例模式和工产模式。

2024-02-28 21:16:07 861

原创 java线程安全(第一篇)

线程安全问题根本原因:1.多个线程之间的调度是随机的,操作系统抢占式的执行策略来调度线程.2.多个线程同时修改同一变量。3.进行的修改不是原子的。4.内存可见性5.指令重排性,引起的线程安全问题。

2024-02-26 15:57:21 812

原创 java线程的中断-interrupted,isinterrupted

线程中断在多线程开发中非常重要。中断线程意味着在线程结束前停止当前的操作。停止线程有许多好处。比如资源的释放,当一个线程完成了任务时,停止该线程可以释放资源。错误处理,如果某个程序发生了错误,停止线程可以防止错误蔓延。性能够优化。停止不必要的线程可以提高程序的性能等。

2024-02-25 10:51:03 1141

原创 java多线程的创建

1一个程序正在运行的时候最少有一个进程,比如我们经常见到的public static void main(),他是由jvm去创建的。进程具有并发执行的特点,线程是进程的“轻量级”表现。也就是说不同的线程也可以同时执行。所以在一个程序中不单单只能有一个线程去执行代码,也可以有多个线程同时去执行。多线程编程可以提高程序的并发性,提高资源的利用率,适应复杂的业务逻辑等优点。所以掌握多线程编程是很重要的。java给我们提供了实现多线程的方式,继承Thread类或实现Runnable接口。

2024-02-24 19:28:28 891 1

原创 Map和Set-java

set.add("花木兰");set.add("公孙离");set.add("亚瑟");set.add("露娜");set.remove("亚瑟");Set是继承自Collection的一个接口类2. Set中只存储了key,并且要求key一定要唯一TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的Set最大的功能就是对集合中的元素进行去重。

2023-10-26 22:10:22 88

原创 优先级队列(PriorityQueue)-java

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2023-10-24 18:17:29 189

原创 数据结构链表-java

单链表只有一个指向其后续的域,使得单链表只能从前到后依次遍历,要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为0(n)。为了一服单链表的上述缺点,引入了双链表,双链表结点中有两个域prev和next域,分别别指向其前驱结点和后继结点。双链表在单链表的结点中增加了一个指向其前驱prev,因此双链表中的按值查找和按位查找的操作与单链表的相同。但双链表在插入和删除操作的实现上,与单链表有着较大的不同。

2023-07-18 15:05:17 210 1

原创 顺序表的实现-java

线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素a,在线顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。//数组的大小 public int size;//数组的有效元素的个数 public static final int capacity = 10;//数组容量 public Seqlist() {

2023-07-11 01:07:40 151 1

原创 单链表---c 语言B版

线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表节点,除存放自身的信息外,还需要存放一个指向其后继的指针。}SLTNode;单链表的data是用来保存数据的,我们对data重命名这样当我们需要保存不同类型的数据时候便于修改,同时单链表也需要定义一个指针去存储下一个结点的地址。

2023-03-15 23:57:22 69

原创 顺序表----c语言实现

线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑是相邻的二个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素Ai在线性表的位序。因此,顺序表的特点是表中元素的逻辑顺序与物理顺序相同。//用来指向开辟的空间int size;//当前存储数据的个数//容量的大小}SL;

2023-03-13 22:10:26 115

原创 字符函数和字符串函数2

上述代码把前16个字节拷贝arr2数组里面去,memcpy的拷贝是一个字节一个字节拷贝的,如果拷贝14个字节,那么结果也是2,3,5,6。因为是小端存放,当拷贝12个字节后也就是3个整形,第4个整形也就是第13,14,15,16字节时,其计算机的存储是06,00,00,00。思路:memove的模拟实现要分2种情况,从前拷贝和从后拷贝,没有重叠的从前拷贝和从后拷贝都可以。memcpy和么move的区别为memcpy拷贝的内存是不能重叠的,memmove拷贝的内存可以重叠。情况二:从后向前拷贝。

2023-01-29 17:39:21 78

原创 字符函数和字符串函数1

注意:size_t返回的一直是个正数,如果2个字符串长度相减,前者大于后者,那么在无符号数的计算中负数只能当成正数处理,会是一个很大的正数。字符串以“\0”为结束标志,strlen统计"\0"以前的字符串个数,该函数的返回值是size_t类型的。到一个字符串中查找另一个字符串,如果查到返回地址,查不到返回空指针。第一个字符串大于第二个字符串返回大于0的数字。第一个字符串小于第二个字符串返回小于0的数字。第一个字符串等于第二个字符串返回等于0的数字。会将源字符的\0拷贝到目标空间。源字符串必须以\0结束。

2023-01-28 11:12:17 114

原创 c语言qsort函数

用冒泡排序实现qsort函数

2023-01-07 17:10:37 186

原创 c语言——扫雷

它的基本规则是随便点一个小格子,就会出现一个小方块。上面显示的数字意味着周围的八个格子里会有几个地雷。例如,1表示周围只有一个矿。右键单击可以标记该网格,左键单击可以打开该网格。扫雷规则是:首先点击顶部的一个小格子,会出现一个小方块。上面显示的数字代表了周围八个网格中的几个矿。只需要判断地雷植旗。找到所有地雷就是胜利。

2022-11-13 14:55:14 209

原创 c语言-五子棋实现

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。已在各个游戏平台有应用。

2022-11-08 16:17:34 350

原创 程序员内功修炼——函数栈帧的创建与销毁

c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关。

2022-11-04 13:00:23 858

空空如也

空空如也

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

TA关注的人

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