- 博客(45)
- 收藏
- 关注
原创 深入解析 MultipartFile:Spring 框架下的高效文件处理方案
通过简洁的 API 设计与 Spring 框架深度集成,显著简化了文件上传开发流程。解耦文件元数据与内容操作:通过方法链实现灵活的数据获取与处理。适配多种存储场景:支持内存 / 磁盘临时存储,自动管理资源生命周期。性能与安全平衡:提供流式操作与校验机制,兼顾效率与稳定性。在实际开发中,结合 Spring Boot 的配置优化与全局异常处理,可构建健壮、高效的文件上传系统。无论是单文件上传、多文件批量处理,还是大文件分块传输,都是 Spring 生态下的优选方案。
2025-06-03 20:08:32
775
原创 图论核心:深度搜索DFS 与广度搜索BFS
DFS 与 BFS 是图论的基石算法,分别代表 “深度探索” 与 “层次扩展” 的思维模式。掌握两者的核心原理、代码实现及适用场景,是解决图论问题的关键。实际应用中,可根据问题特性灵活选择算法,并结合优化技巧提升效率。
2025-05-25 22:14:03
1041
原创 状态压缩动态规划:用二进制“魔法”破解组合难题
动态规划的核心在于将问题分解为子问题,并通过记录子问题的解来避免重复计算。而状态压缩动态规划,则是在这一基础上,针对集合类问题进行优化。当问题涉及到对一个小规模集合(通常元素个数n ≤ 20)的所有子集进行枚举和决策时,我们可以利用二进制数将集合状态压缩成一个整数,每一位代表一个元素的存在与否(1表示存在,0表示不存在),从而高效地进行状态表示和转移。例如,对于一个包含4个元素的集合,二进制数1011就表示子集{a, c, d},其中第0、2、3位为1,对应元素acd被选中。
2025-05-12 22:34:17
663
原创 网格图dfs和bfs两种算法的区别,以及在什么情况下替换会导致
网格图(Grid Graph)是图论中的一种特殊结构,DFS(深度优先搜索)和BFS(广度优先搜索)作为两种基本图遍历算法,在网格图中表现出显著不同的特性和适用场景。DFS(深度优先搜索)和BFS(广度优先搜索)虽然都是图遍历算法,但在许多实际场景中它们有着本质区别,不能简单互换。:要记录所有可能的路径然后比较长度,时间复杂度可能达到O(b^d),b是分支因子,d是最大深度。适合深度大但宽度有限的树/图结构(如线性链表,空间O(1))空间复杂度:O(h),h为递归深度(树的高度)
2025-05-12 17:50:59
1013
原创 网格图之bfs
BFS在网格图中的这些特性使其成为解决空间搜索问题的强大工具,特别是在需要最短路径或层级信息的场景下表现出色。:从起点开始逐层向外扩展,先访问所有距离为1的节点,再距离为2的节点,依此类推。:使用队列(queue)数据结构实现"先进先出"的访问顺序。每个海洋区域到最近陆地的距离(LeetCode 542):在无权网格中,首次访问某节点时的路径必然是最短路径。:通常处理4方向(上下左右)或8方向(含对角线)移动。时间复杂度O(mn),空间复杂度O(mn)的图为例子,这个就是网格图。
2025-05-12 17:39:11
599
原创 网格图之dfs模版
DFS会从起点开始,沿着一条路径尽可能深入,直到无法继续前进再回溯。就地修改网格标记访问状态,空间复杂度O(1)(不考虑递归栈)需要从边界开始标记所有连通边界区域,然后填充剩余区域。:使用显式栈或递归隐式栈实现"后进先出"的探索顺序。:在4连通网格中,每次移动限制在上下左右4个方向。通过DFS探索相邻单元格,记录形状的拓扑结构。被包围的区域(LeetCode 130)检测网格中的特定形状(如L形、T形等):需要特别处理网格边缘的移动限制。俄罗斯方块类游戏中的形状匹配。图像处理中的连通区域标记。
2025-05-12 17:20:44
913
原创 单调栈模版型题目(3)
首先我们要明白什么叫做贡献,在一个数组b={1,3,5}中,连续包含1的连续子数组为{1},{1,3},{1,3,5},一共有三个,这三个数一共能组成6个连续子数组,而其中3个子数组都有1,那么就代表了1的贡献值为3,也就是6*1/2。由于 a[i]a[i] 比 a[j]a[j] 更靠近后面的元素 xx,所以 a[j]a[j] 将永远不会再被用作边界值。如果发现 a[i]≤a[j]a[i]≤a[j](其中 a[j]a[j] 是栈顶元素)因此可以直接将 a[j]a[j] 弹出栈(它已经"没有任何作用了")
2025-05-09 21:35:25
887
原创 单调栈所有模版(2)
那么接下来我们要想到如何求最大的矩形面积,如果我们以数组中的第二个数字为高,那么此时,从第二个数字,矩形向两边延伸,发现,没有任何一个高小于1这个高,所以矩形的面积是一直增大的,那么最大的矩形面积就是把整个数组都算上,通过上述简短的分析,我们可以看出,我们要保证某一个元素为高,我们就要保证,矩阵中没有比当前高还小的元素,我们很轻松的就想到了利用单调栈来找到,用,两边第一个小于自己的元素。当然三次循环的次数我们肯定是可以优化的,我们可以采用一次遍历的方法,在两个单调栈出栈的时候计算面积大小。
2025-05-09 21:12:39
446
原创 单调栈所有模版型题目(1)
这个图里有5个数字,我们从右往左看,第一个数字是4,第二个数字是7,数字4小于数字7,所以7这个数之前的下一个更大值永远不会是4,那么此时4在数组里就相当于没有用了,所以我们需要一个数据结构来维护数据,保证我们可能需要的最大数字,那么我们想到了栈这种数据结构可以维护数据的出入并且保证是大数替换小数。
2025-05-09 20:30:49
447
原创 探索Dijkstra算法:求解单源最短路径的
Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra于1959年提出的,专门用于在带权有向图中,求解从一个给定源点到其他所有顶点的最短路径。它的核心思想基于贪心策略,每次从尚未确定最短路径的顶点中选择距离源点最近的顶点,然后利用这个顶点去更新其他顶点到源点的距离。Dijkstra算法作为求解单源最短路径的经典算法,虽然在某些情况下存在一定的局限性(如不能处理负权边),但在众多实际场景中发挥着重要作用。
2025-04-16 11:29:21
945
原创 如何快速求解最大公约数和最小公倍数(附c++/java/python代码)
原理:从i1i = 1i1开始,每次加1,一直到x和y中较小的那个值,然后找出能同时整除x和y的i值,这些i值的乘积就是最大公约数。代码实现(以Java为例)最大公约数在这里插入代码片if(x > y){x = y;y = temp;i <= x;y = y / i;- **最小公倍数**:最小公倍数等于最大公约数乘以最后的x和y值。y = temp;i <= x;
2025-04-16 11:18:53
1024
原创 windows中查看cmd和powerShell的编码方式
修改 CMD 或 PowerShell 的默认编码,可以修改注册表或配置启动参数。这样,你就可以轻松查看和修改终端的编码方式了!在 PowerShell 配置文件(
2025-04-08 08:55:48
562
原创 威佐夫博弈论
((3, 5))同样是必败态,此时(k = 2),(\lfloor 2\times\frac{1 + \sqrt{5}}{2}\rfloor = 3),(3 + 2 = 5),以此类推。对于两堆物品,若两堆物品的数量分别为(a)和(b)((a \leq b)),当且仅当(a = \lfloor k\times\frac{1 + \sqrt{5}}{2}\rfloor),(b = a + k)((k)为自然数,(\lfloor\ \rfloor)表示向下取整)时,该状态为必败态。
2025-04-01 20:48:29
433
原创 数据结构值ST表的详细讲解浅显易懂
ST表,即Sparse Table(稀疏表),是一种基于倍增思想的数据结构。它主要用于在**O(1)**时间复杂度内查询给定区间的最值(最大值或最小值)。其原理是通过预处理,利用倍增的思想,将每个区间的最值信息存储起来,以便后续快速查询。
2025-04-01 17:42:54
513
原创 java中什么是包装类
Java 5 引入了自动装箱(Autoboxing)和拆箱(Unboxing)特性,简化了基本类型与包装类之间的转换。自动装箱是指基本类型数据在需要对象的环境中时,会自动转为对应的包装类对象;自动拆箱则是当需要基本数据类型的值时,包装类对象会自动转换为基本数据类型。在计算机编程领域,尤其是 Java 语言中,包装类(Wrapper Class)是用于将基本数据类型包装成对象的类。为每个基本数据类型设计了对应的包装类,即。Java 中有 8 种基本数据类型,分别是。
2025-03-25 08:34:08
193
原创 辨析http请求、响应的格式,以及URL在其中扮演怎样一个作用
HTTP 请求的格式包括:请求行(方法、目标、版本)。请求头(元信息)。空行(分隔符)。请求体(可选,用于传输数据)。
2025-03-05 21:28:21
623
原创 《Java 中 Thread 类的基本用法总结》
在 Java 编程中,Thread类是实现多线程的核心类之一。下面将对Thread类在创建线程、线程中断、线程等待、线程休眠和获取线程实例等方面的基本用法进行总结。
2025-01-05 12:47:48
394
原创 进程和线程的区别与联系及内存管理的差别
区别 资源分配角度 进程:是操作系统进行资源分配的基本单位。这意味着每个进程都有自己独立的一套资源,包括内存空间(代码区、数据区、堆、栈)、文件描述符、进程控制块(PCB)等。例如,在一个操作系统中运行的两个不同的浏览器进程,它们分别有自己独立的内存区域来存储浏览器程序代码、用户访问的网页数据、下载文件的缓存等,并且各自有独立的文件描述符来管理对本地文件的访问,如保存书签文件等。 线程:是进程的一个执行单元,它自己不拥有系统资源,而是和同进程内的其他线程共享进程的所有资源。比如在一
2025-01-05 12:23:30
1108
原创 Linux编译器-gcc/g++使用
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。在编译链接时并没有把库文件的代码加入到可执行文件中。默认生成的二进制程序,是动态链接的,这点可以通过。首先要检查代码的规范性、是否有语法错误等。在编译时默认使用动态库。把库文件的代码全部加入到可执行文件中。就不再需要库文件了。编译到汇编语言不进行汇编和链接。此选项对生成的文件采用静态链接。在预处理结束后停止编译过程。连接(生成可执行文件或库文件。该选项只进行编译而不进行汇编。以确定代码的实际要做的工作。汇编阶段是把编译阶段生成的。
2024-10-19 23:14:32
511
原创 python的异常处理
try…except的语法结构为: try: 可能会抛出异常的代码 except 异常类型: 异常处理代码(报错后执行的代码)try…except…except的语法结构为: try: 可能会抛出异常的代码 except 异常类型A: 异常处理代码(报错后执行的代码) except 异常类型B: 异常处理代码(报错后执行的代码)
2024-10-16 21:20:50
372
原创 字符串及正则表达式
2.f-string:Python3.6引入的格式化字符串的方式,比{}标明被替换的字符。将bytes类型转换成str类型,需要使用到bytes类型的decode()方法。1.占位符:%s :字符串格式 %d :十进制整数格式 %f :浮点数格式。3.str.format()方法:模板字符串.format(逗号分隔的参数)将str类型转换成bytes类型,需要使用到字符串的encode()方法。2、使用字符串的join()进行拼接。1.字符串拼接及not in。4、用格式化字符串进行拼接。
2024-10-16 20:51:47
749
原创 详述python的列表、元组、字典、集合的基本语法及其函数
是指一系列的按特定顺序排列的元素组成。是Python中内置的可变序列 在Python中使用[]定义列表,元素与元素之间使用英文的逗号分隔。列表中的元素可以是任意的数据类型。1) 使用[]直接创建列表 语法结构如下: 列表名=[element1,element2,......elementN]2)使用内置函数list()创建列表 语法结构如下: 列表名=list(序列)语法结构如下: del 列表名。
2024-10-13 13:49:23
838
原创 Linux编辑器-vim的配置及其使用
1.命令模式(默认模式):用户所有的输入都会当作命令,不会当作文本输入。2.插入模式:写代码,按「i」切换进入插入模式「」,按“i”进入插入模式后是从光标当前位置开始输入文件;按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。3.底行模式:对代码进行保存,退出等。4.替换模式。
2024-10-11 22:42:40
816
原创 通过yum进行linux软件下载
在Linux下安装软件一个通常的办法是下载到程序的源代码并进行编译得到可执行程序但是这样太麻烦了于是有些人把一些常用的软件提前编译好做成软件包可以理解成windows上的安装程序放在一个服务器上通过包管理器可以很方便的获取到这个编译好的软件包直接进行安装软件包和软件包管理器就好比"App"和应用商店这样的关系是Linux下非常常用的一种包管理器主要应用在Centos等发行版上。
2024-10-11 22:00:28
272
原创 linux中将普通用户添加到系统白名单中
打开 sudoers文件,在Allow root to run any commands anywhere 后面 添加一条(把上面的一条内容复制下来 修改用户名即可)
2024-10-10 22:49:38
344
原创 linux常见指令
指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,:对于目录,该命令列出该目录下的所有子目录与文件。命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,
2024-10-09 22:26:01
1248
原创 浅谈双指针来解决两数之和或三数之和
双指针其大体思想是:1.先对数组进行排序,而排序的原因是左右指针其相加大于一个数字,会让指针所指向数字小的往对方的方向走,这就要保证数组的大小的连续性,4.两数相加,如果其大于目标数减去固定的一个数字,那么就让左右指针中相对较小的一个向着对方的方向走去;反之,则让较大的向对方走去。5.结束的条件是左指针大于等于右指针,此时将固定的数字向下走一位;2.固定一个数字,使其三数之和变为两数之和。答案中不可以包含重复的三元组。的第15题和第18题为例。,判断是否存在三元组。
2024-05-03 16:27:04
396
1
原创 浅谈链表中利用快慢指针解决有环问题
那我们就能得到L的长度为nR-x,此时我们让头节点head开始走,并同时创建一个指针,让其从快慢指针相交的地方开始走,此时相交的指针meet距离环入口的距离为R-x,而head距离入口的距离为nR-x,那么此时二者一定会在环入口相交。这题我们还是先创建一个快慢指针,但是此时快慢指针的的起始位置都是一样的,接着遍历寻找二者相交的位置。我们设环的总长度为R,那么快指针所走路程是慢指针的2倍,所以我们就可以列出下列等式。在这个过程中,slow走过的路程为不是环的长度L,与进环后相交之的长度x。
2024-05-03 16:03:05
81
原创 指针(2)进阶指针
例如我规定一个数组各位学过指针初阶的肯定都知道数组的地址是首元素的地址,而一维数组的的首元素是一个数,在所以我们直接用就能得到数组的地址(即首元素地址),此时解引用输出指针我们就数组数组首元素的大小,但是我们如果想让指针指向数组的第二个元素,直接让ptr向后移动一个单位长度(大小为4上面提到过)。int 的大小为四个字节,也就是说数组每个元素大小都是四个字节,并且int *移动一个大小为4个字节,那么ptr=ptr+1,我们就能得到指向第二个数组元素的指针。在这个过程中ptr+1就是指针的移动。
2024-01-31 15:38:52
1524
1
原创 指针(1)初始指针
指针是计算机编程中的一个重要概念,它是用来存储变量地址的一种数据类型。简单来说,指针就是变量的内存地址。例如我定义int a;然后指针就=&a,那么我在屏幕上输出这个指针就相当于输出a的地址;整型指针(int*):指向整型变量的指针。字符型指针(char*):指向字符型变量或字符串的指针。浮点型指针(float*):指向浮点型变量的指针。双精度浮点型指针(double*):指向双精度浮点型变量的指针。结构体指针(struct*):指向结构体类型的指针。
2023-12-16 11:52:18
130
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人