- 博客(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
原创 网络编程^
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
原创 MySQL事务
本文讲解 MySQL 事务的核心概念与用法。先介绍事务的基本含义与 ACID 特性,再演示开启事务后的提交、回滚、保存点等操作,以及 MySQL 手动/自动提交机制;最后重点分析四种隔离级别(读未提交、读已提交、可重复读、串行化)带来的脏读、不可重复读、幻读等并发问题,并对比各隔离级别的安全性与性能。
2026-09-29 10:41:11
163
原创 数据库约束
数据库约束是对数据的条件限制,确保数据的完整性与准确性。主要类型包括:NOT NULL(非空)、DEFAULT(默认值)、UNIQUE(唯一性)、PRIMARY KEY(主键,唯一且非空)、FOREIGN KEY(外键,建立表间关联)和CHECK(条件检查)。主键通常自增,外键需依赖父表存在对应数据,删除或更新父表记录前须确保子表无引用。约束共同保障数据一致性与可靠性。
2026-09-24 09:13:06
220
原创 库和表基本操作、表的增删改查
本文从 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关注的人
RSS订阅