自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTPS协议

HTTPS 在 HTTP 基础上引入加密层,保障数据安全。为防止明文传输被篡改,采用对称加密(高效)与非对称加密(安全)结合:非对称加密用于安全传输对称密钥,后续通信使用对称加密提升效率。但非对称加密易受中间人攻击,因此引入证书机制——由可信 CA 签发证书,包含公钥及身份信息,客户端通过验证证书合法性确认服务器身份,有效防范中间人攻击,确保通信安全。

2026-11-01 11:30:47 66

原创 HTTP协议

介绍超文本与 HTTPS 的基本概念;随后讲解 HTTP 请求与响应的报文格式,并结合 Fiddler 抓包演示;最后深入 HTTP 请求的细节,包括 URL 的组成、URL encode 编解码、GET/POST 等常用方法及其区别、请求报头字段,以及 HTTP 响应的状态码与响应报头。

2026-10-31 15:03:07 167

原创 TCP协议 2

滑动窗口、流量控制、拥塞控制、延迟应答、捎带应答

2026-10-26 13:40:23 248

原创 TCP协议 1

确认应答、超时重传、 三次握手、 四次挥手

2026-10-24 13:31:19 173

原创 网络编程^

Socket是应用层与传输层之间的网络通信接口,主要分为TCP和UDP两种。TCP提供有连接、可靠、面向字节流的通信;UDP则为无连接、不可靠、面向数据报。本文以UDP回显服务为例,演示了DatagramSocket与DatagramPacket的使用:服务器通过receive()接收客户端数据,经处理后通过send()返回响应,需指定客户端地址;客户端自动分配端口,发送请求并接收响应。整个过程体现了UDP的无连接特性与高效性。

2026-10-21 18:47:23 231

原创 网络通信^

本文从局域网与广域网的基本概念讲起,介绍 IP 地址用于定位主机、端口号用于区分应用程序;接着说明网络协议是通信双方共同遵守的约定,并通过协议分层降低复杂度,引出 OSI 七层模型与 TCP/IP 五层(四层)模型。最后以 QQ 发送 “hello” 为例,详细讲解数据发送时的封装过程和接收时的分用过程,理解控制信息如何逐层添加与解析。

2026-10-19 10:46:07 172

原创 多线程 5

本文介绍了 堵塞队列和 它的模拟

2026-10-12 18:36:52 95

原创 多线程 4

本文介绍了单例模式的 2 种实现模式 : 饿汉模式 、懒汉模式

2026-10-11 12:59:04 197

原创 多线程 3

本文介绍了线程安全、notify() 和 wait()

2026-10-10 12:19:13 175

原创 多线程 2

本文介绍了 Thread类以及常见方法、线程的状态

2026-10-07 21:35:45 238

原创 多线程 1

什么是线程 、 线程和进程的区别、线程的创建

2026-10-06 10:12:52 207

原创 MySQL事务

本文讲解 MySQL 事务的核心概念与用法。先介绍事务的基本含义与 ACID 特性,再演示开启事务后的提交、回滚、保存点等操作,以及 MySQL 手动/自动提交机制;最后重点分析四种隔离级别(读未提交、读已提交、可重复读、串行化)带来的脏读、不可重复读、幻读等并发问题,并对比各隔离级别的安全性与性能。

2026-09-29 10:41:11 163

原创 MySQL索引

本文介绍了索引,实现索引的数据结构,索引的类型, 索引的创建、查看和删除

2026-09-27 11:31:00 162

原创 联合 查询

本文介绍了关于联合查询包括内连接、外连接、子连接

2026-09-25 14:23:11 238

原创 数据库约束

数据库约束是对数据的条件限制,确保数据的完整性与准确性。主要类型包括:NOT NULL(非空)、DEFAULT(默认值)、UNIQUE(唯一性)、PRIMARY KEY(主键,唯一且非空)、FOREIGN KEY(外键,建立表间关联)和CHECK(条件检查)。主键通常自增,外键需依赖父表存在对应数据,删除或更新父表记录前须确保子表无引用。约束共同保障数据一致性与可靠性。

2026-09-24 09:13:06 220

原创 聚合 查询

本文介绍了SQL中的聚合查询、分组(GROUP BY)及HAVING子句。

2026-09-22 20:07:35 165

原创 库和表基本操作、表的增删改查

本文从 MySQL 与数据库的基本概念入手,整理了 MySQL 常用操作:库的创建、查看、使用与删除;表的创建、查看、删除与结构查看;以及数据的增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作,其中重点介绍 SELECT 检索的多种用法,包括条件检索、去重、别名、模糊检索、排序、分页查询等

2026-09-21 15:27:48 265

原创 和为 K 的子数组

本文讲解 LeetCode「和为 K 的子数组」的解法。核心思路是使用哈希表记录前缀和,在遍历数组时检查 sum - k 是否已出现,最终得到 和为 k 的子区间个数

2026-09-06 16:31:57 332

原创 最小路径和

本文讲解了 LeetCode「最小路径和的题解,完整演示动态规划的标准解题流程:先用 dp[i][j] 表示到达 (i, j) 位置的最小路径和,再依据最近一步推导出状态转移方程 dp[i][j] = Math.min(dp[i][j-1], dp[i-1][j]) + grid[i-1][j-1];随后通过多开一行一列并初始化为 Integer.MAX_VALUE 来防止填表越界,最后按从上到下、从左到右的顺序填表并返回 dp[m][n]。

2026-09-01 14:00:48 561

原创 下降路径最小和

本文详细讲解 LeetCode「下降路径最小和」这道经典动态规划题。文章从状态表示、状态转移方程推导、dp 表初始化、填表顺序到返回值,逐步拆解完整解题思路。

2026-08-31 15:48:55 580

原创 珠宝的最高价值

本文讲解 LeetCode「珠宝的最高价值」一题的动态规划解法。核心思路是:定义 dp[i][j] 表示到达 [i, j] 位置时能拿到的宝石最高价值;由于每次只能向右或向下移动,到达某位置只能来自左边或上边,因此状态转移方程为 dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + frame[i-1][j-1]。通过多开一行一列简化初始化,最终返回 dp[m][n] 即为答案。

2026-08-30 15:13:02 486

原创 无重复字符的最长子串

本文介绍了无重复字符的最长子串解题思路,先用双指针引出暴力做法的重复检查问题,再说明为什么滑动窗口更契合,最后给出滑动窗口的四步操作

2026-08-29 16:03:22 330

原创 三数之和`

本文介绍了「三数之和」的解题思路,采用「排序 + 固定一个数 + 双指针」的解法,将问题转化为两数之和,并通过固定值去重与双指针去重避免重复三元组。

2026-08-29 11:04:07 371

原创 只出现一次的数字 Ⅱ

本文讲解 LeetCode「只出现一次的数字 Ⅱ」的解法。题目要求在线性时间复杂度和常数空间内,找出数组中唯一一个出现一次的元素(其余元素均出现三次)。核心思路是按位统计:遍历 32 位比特位,统计所有数字在第 i 位上 1 的个数并 % 3,余数为 1 则说明目标数字在该位为 1

2026-08-28 12:14:04 572

原创 消失的两个数字

本文讲解 LeetCode「消失的两个数字」的解法。已知数组缺失1 ~ nums.length + 2 中的两个数字,算法先将原数组与完整数组整体异或,得到两个消失数字的异或值 a ^ b;再利用 a ^ b 中某个为 1 的比特位进行分组异或,最终分别求出这两个数字。整体时间复杂度为 O(n),空间复杂度为 O(1)。

2026-08-27 21:39:42 269

原创 随机链表的复制

本文介绍了 「随机链表的复制」一题。题目要求深拷贝一个带随机指针的链表。解题核心是借助哈希表,第一遍遍历复制节点值并建立原节点到新节点的映射,第二遍遍历利用映射完成 `next` 与 `random` 指针的连接,最终返回新链表的头节点。

2026-08-27 18:57:49 280

原创 前 K 个高频元素

本文介绍了「前 K 个高频元素」的解法。核心思路是先用哈希表统计每个数字的出现次数,再利用大小为 k 的小顶堆维护频次最高的 k 个元素

2026-08-27 12:37:31 319

原创 最小K个数

本文介绍了「最小K个数」的解法。核心思路是使用优先级队列(大顶堆)来维护当前最小的 k 个元素:先构建包含前 k 个元素的大顶堆,然后遍历剩余元素,若遇到比堆顶更小的值,则替换堆顶并调整堆。最终堆中保留的即为数组中最小的 k 个数。代码实现中通过自定义比较器构建大顶堆,时间复杂度为 O(n log k),空间复杂度为 O(k)。

2026-08-22 12:16:05 276

原创 环形链表 II

本文介绍了LeetCode环形链表II问题的解决方案。通过快慢指针算法,首先找到链表中的相遇节点,然后使用两个指针分别从链表头部和相遇节点出发,以相同速度移动直到相遇,该相遇点即为环的入口节点。文

2026-08-22 11:48:31 139

原创 环形链表`

本文介绍了判断链表是否有环的经典双指针解法。通过初始化快慢指针都指向头节点,快指针每次走两步,慢指针每次走一步。如果快指针遇到空节点说明无环;若快慢指针相遇则说明有环。这种方法时间复杂度O(n),空间复杂度O(1),是检测链表环的高效算法。代码使用Java实现,简洁明了地展示了这一思路。

2026-08-21 14:13:23 288

原创 相交链表`

题目要求找出两个单链表相交的起始节点。解法步骤如下:1. 遍历链表计算长度lenA和lenB;2. 定义指针curA和curB,长链表指针先移动|lenA - lenB|步以对齐起点;3. 两指针同步移动,直到相遇(即相交节点)或同时为null(无相交)。

2026-08-21 13:49:50 314

原创 链表分割`

题目要求将链表中小于x的节点排在大于等于x的节点前,且保持原有顺序。解题思路是创建两个子链表small和large分别存放不同节点,遍历原链表进行分割后拼接。代码实现中处理了空链表、单节点链表以及全大/全小等特殊情况,最后将两个子链表正确连接并返回。关键点在于维护两个子链表的尾指针,并在拼接时处理边界条件。

2026-08-21 13:07:32 299

原创 链表的回文结构

本文介绍了两种判断链表是否为回文结构的解法。第一种方法是复制链表并逆置,然后比较原链表和逆置链表的节点值,虽然通过测试但空间复杂度为O(N)。第二种方法是找到链表中间节点,逆置后半部分,然后使用双指针比较对应节点值,满足空间复杂度O(1)的要求。两种方法都通过比较链表节点的值来判断回文结构,但第二种方法更优,符合题目对空间复杂度的限制。

2026-08-20 13:33:25 405

原创 快速排序(递归和非递归)

本文介绍了快速排序算法的基本思想及其递归与非递归实现。基本思想是选取数组末尾元素为基准值,将小于基准值的元素置于左侧,大于基准值的置于右侧,递归处理左右子区间。非递归版本使用栈存储待处理区间下标,通过循环出栈处理区间并分割子区间,直到栈空完成排序。代码提供了完整的Java实现,包括分区函数partition、递归版本quickSortHelper和非递归版本qickSortByLoop,核心都是通过基准值划分区间并排序。非递归方法通过栈模拟递归过程。

2026-08-20 11:55:46 443

原创 合并两个有序链表

本文介绍了合并两个有序链表的算法。通过使用双指针遍历两个链表,比较节点值并将较小值节点连接到结果链表中。当任一链表遍历完成后,将剩余链表直接连接到结果末尾。

2026-08-20 11:29:13 154

原创 链表中倒数第k个结点

题目要求找出链表中倒数第k个结点。解题思路是使用快慢指针法:先让快指针fast走k步,然后慢指针slow和fast同时移动,当fast到达链表末尾时,slow指向的就是倒数第k个结点。如果k大于链表长度,则返回null。代码实现中先处理k值合法性,然后通过双指针遍历链表,最终返回慢指针指向的结点。这种方法只需一次遍历,时间复杂度为O(n)。

2026-08-20 10:56:00 136

原创 链表的中间结点

本文介绍了使用快慢指针法查找链表中间节点的解决方案。通过设置slow指针每次移动1步,fast指针每次移动2步,当fast指针到达链表末尾时,slow指针正好位于中间位置。该方法适用于奇数和偶数长度的链表,时间复杂度为O(n)。代码实现简洁高效,只需遍历一次链表即可得到结果。

2026-08-19 15:01:26 257

原创 反转链表`

反转单链表。解题思路是使用三个指针:head、cur和nextNode。首先将head.next置空,然后通过循环依次反转节点指向,直到遍历完整个链表。具体实现中,每次迭代保存当前节点的下一个节点,修改当前节点指向,然后移动指针继续处理后续节点。最终返回新的头节点head。该方法时间复杂度为O(n),空间复杂度为O(1)。

2026-08-19 14:19:26 340

原创 从中序与后序遍历序列构造二叉树

这道题目要求根据二叉树的中序遍历和后序遍历序列重建原始二叉树。解题关键在于利用后序遍历确定根节点,然后在中序遍历中分割左右子树。具体步骤是:1) 后序数组末尾元素是根节点;2) 在中序数组中找到根节点位置,左边是左子树,右边是右子树;3) 递归处理左右子树。

2026-08-19 12:14:15 289

原创 从前序与中序遍历序列构造二叉树

本文介绍了如何根据二叉树的前序遍历和中序遍历结果重构原始二叉树。解题关键在于利用前序遍历确定根节点,再通过中序遍历分割左右子树。代码实现中,使用递归方法,每次从前序遍历获取根节点,在中序遍历中找到其位置以划分左右子树区间,然后递归构建左右子树。核心步骤包括:1)前序首元素为根节点;2)中序中定位根节点位置;3)递归处理左右子树区间。

2026-08-19 11:54:30 334

空空如也

空空如也

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

TA关注的人

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