- 博客(137)
- 收藏
- 关注
原创 【JAVA EE初阶】网络初识
1.应用程序获取用户输入,构造一个应用层的数据包,这个应用层数据包就会遵守应用层协议(往往是开发这个程序的程序员定义的),应用层数据包往往是“结构化数据”(C的结构体,有很多属性),发送数据的时候,把结构化数据转化为字符串/二进制bit流(序列化),接受数据的时候,把字符串/二进制bit流转化为结构化数据(反序列化)。通过路由器,将多个局域⽹连接起来,在物理上组成很⼤范围的⽹络,就形成了⼴域⽹。协议,⽹络协议的简称,⽹络协议是⽹络通信(即⽹络数据传输)经过的所有⽹络设备都必须共同遵从的⼀组约定、规则。
2025-08-14 10:31:55
364
原创 【JAVA EE初阶】文件IO
这时候让file1说出file2的位置则为:../path2/file2;解释下就是,file1在path1文件夹下,先点点,回退到file文件夹下,然后加上path2/file2,也就是../path2/file2,这就是相对路径了。比如:file1的位置为:C:\file\path1\file1;file2的位置为C:\file\path2\file2;扫描指定⽬录,并找到名称中包含指定字符的所有普通⽂件(不包含⽬录),并且后续询问⽤⼾是否要删除该⽂件。包含指定字符的所有普通⽂件(不包含⽬录)
2025-08-13 15:25:41
403
原创 【JAVA EE初阶】多线程(进阶)
本质上是懒汉模式。使⽤信号量可以实现 "共享锁", ⽐如某个资源允许 3 个线程同时使⽤, 那么就可以使⽤ P 操作作为加锁, V 操作作为解锁, 前三个线程的 P 操作都能顺利返回, 后续线程再进⾏ P 操作就会阻塞等待, 直到前⾯的线程执⾏了 V 操作.(乐观锁的场景,本身遇到锁竞争的概率很小,真的遇到竞争,在短时间内就能拿到锁)如果获取锁失败, ⽴即再尝试获取锁, ⽆限循环, 直到获取到锁为⽌. 第⼀次获取锁失败, 第⼆次的尝试会在极短的时间内到来. ⼀旦锁被其他线程释放, 就能第⼀时间获取到锁.
2025-08-08 19:01:23
878
原创 【JAVA EE初阶】多线程(下)
类似一个循环队列(数组),每个元素是一个“时间单位”,每个元素又是一个链表,每到一个时间单位,光标指向下一个元素,同时把这个元素上对应链表中的任务都执行一遍。线程池里,提前准备好10个线程,有100个客户端把请求发过来,把这100个客户端的请求封装成任务(Runnable)添加到线程池里,线程池中由10个线程负责处理这100个任务,这个过程就不涉及线程的创建销毁了。比如有若干个线程使用这个队列,要么所有的线程阻塞在put,要么所有的线程阻塞在take,不可能一部分线程阻塞在put一部分线程阻塞在take.
2025-08-05 10:12:49
618
原创 【leetcode题解】递归、搜索与回溯
只关心“不合法”的分支:check[i]==true||(i!=0&&nums[i]==nums[i-1]&&check[i-1]==false)只关心“合法”的分支:check[i]==false&&(i==0||nums[i]!=nums[i-1]||check[i-1]==true)全局变量:解决数字与字符串之间的映射关系->使用字符串数组;1.无脑循环(时间复杂度高)解法:先把数组进行排序。考虑当前位置能否放上皇后。2.类似哈希表的策略。
2025-07-29 19:11:19
361
原创 【JAVA EE初阶】多线程(上)
不同的操作系统之间不兼容,java却有“跨平台”特性,不需要任何修改,就可以在不同的系统上完成同样的功能,原因在于Java虚拟机,不同的主流系统都有各自的Java 虚拟机,Windows有Windows JVM,Linux有Linux JVM,这些JVM是不同的程序,但是上层支持的Java字节码是一致的。当一个线程循环进行上述读取变量操作的时候,就会把主内存中的数据,拷贝到该线程的工作内存中,后续另一个线程修改,也是先修改自己的工作内存,拷贝到主内存中。等先走的线程解锁,后走的线程才能加上锁,继续执行。
2025-07-29 19:09:17
827
原创 【leetcode题解】动态规划
1049. 最后一块石头的重量 II - 力扣(LeetCode)解法:问题转化为:在数组中选择一些数,使这些数之和尽可能接近sum/2;1.状态表示:dp[i][j]表示从前i个数中选,总和不超过j,此时的最大和2.状态转移方程:3.初始化:无需初始化;下标的映射关系4.填表顺序:从上往下5.返回值:return sum-2*dp[n][sum/2];sum += x;i <= n;i <= n;i++) {
2025-05-27 21:05:56
924
原创 【数据结构】排序
基本思想:任取待排序序列中某元素作为基准值,以该元素为基准,将待排序序列分成两个子序列,左子序列元素均小于基准值,右子序列元素均大于基准值,然后左右子序列重复该过程,直到所有元素都排列在相应的位置上为止。桶排序是一种基于分布的排序算法,它将元素分散到几个桶中,然后对每个桶分别排序,最后合并所有桶中的元素。基本思想:选定一个整数N,把待排序文件中所有记录分成多个组,所有距离为N的记录分在同一组,对每组记录进行排序,重复上述分组和排序工作,当N==1时,记录排好序。内部排序:数据元素全部在内存中的排序。
2025-04-28 22:53:00
1056
原创 【数据结构】优先级队列
使用时必须导入PriorityQueue所在的包PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则抛出异常不能插入null对象,否则抛出异常没有容量限制,可以插入任意多个元素,其内部可以自动扩容插入和删除元素的时间复杂度为O(logN)PriorityQueue底层使用了堆数据结构默认情况下是小堆,即每次获取到的是最小元素PriorityQueue():创建一个空的优先级队列,默认容量是11。
2025-04-26 23:49:40
1083
原创 【数据结构】链表
思路三:创建小链表和大链表,遍历原链表,尾插到大小链表,将小链表的尾节点和大链表的第一个有效节点首尾相连。指向第一个节点的指针的地址 &plist<——>pphead。2. 遍历,count计节点数,返回(count / 2)的next节点。思路一:在原链表上修改,若pcur结点的值小于x,往后走;思路二:创建新链表,遍历原链表(若pcur结点的值小于x,带头:链表中有哨兵位节点,该哨兵位节点为头节点。1. 创建新链表,将原链表中的节点拿过来头插。链表由一个一个的节点组成,
2025-04-23 00:32:29
874
原创 【数据结构】二叉树
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点——对应时称之为完全二叉树(解法一:两条路径的交叉点,使用两个栈存放,多的那一个栈先弹出多余的元素,然后两个栈同时弹出元素,当两个元素相等时,即为共同祖先(巧妙)二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式。:若一个结点含有子结点,则称这个结点为其子结点的父结点;:一个结点含有的子树的根结点称为该结点的子结点;:一棵树中,没有双亲结点的结点;:树中结点的最大层次。
2025-04-23 00:26:29
1120
原创 【leetcode题解】算法练习
解法:用两个栈来模拟(细节:字符串这个栈中,先放入一个空串)策略一:计算当前元素后面,有多少元素的两倍比我小(降序)策略二:计算当前元素之前,有多少元素的一半比我大(升序)左右部分的下标已被重新排序,下标已经不是原来的下标了。解法:利用栈进行模拟(直接用数组就可以模拟栈结构)策略:当前元素的后面,有多少个比较小(降序)1. 左半部分的个数+右半部分的个数+策略一:找出该数之前,有多少个数比我大。策略二:找出该数之后,有多少个数比我小。,如果是降序,会有元素被重复统计。,如果是升序,会有元素被重复统计。
2025-04-21 21:22:53
834
原创 【leetcode题解】滑动窗口
2. left与right指针的移动 -> 移动的步长是单词的长度 -> len。出窗口:出去前->hash2[out]<=hash1[out]->count--转化:找出一个最长的子数组的长度,子数组中不超过两种类型的水果(两“种”数)进窗口:进入后->hash2[in]<=hash1[in]->count++利用单调性,使用“同向双指针”(滑动窗口)来优化暴力解法(O(n))解法一:暴力枚举+哈希表(判断字符是否重复出现)O(解法:滑动窗口+哈希表(用于统计)解法:滑动窗口+哈希表。
2025-04-21 21:20:14
809
原创 【数据库】事务
事务保证数据安全,索引提升查询效率事务把一组SQL语句打包成一个整体,在这组SQL执行过程中,要么全部成功,要么全部失败,这组SQL语句可以是一条也可以是多条。不同的客户端对同一张表进行数据修改时可能出现相互影响的情况,为了保证不同事物之间在执行过程中不受影响,事物之间需要进行隔离,这种特性称为隔离性。
2025-04-20 18:48:33
709
原创 【数据库】索引
在.ibd(innodb存储引擎后生成的表空间文件后缀是.ibd)文件中最重要的结构体就是Page(页),页是内存与磁盘交互的最小单元,默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,这样做是因为在使用数据的过程中,根据局部性原理,将来要使用的数据大概率与当前访问的数据在空间上是邻近的,所以一次从磁盘中读取一页的数据放入内存中,当下次查询的数据还在这个页中时就可以从内存中直接读取,从而减少磁盘I/O提高性能。与普通索引类似,区别在于唯一索引的列不允许有重复值。
2025-04-20 14:49:27
949
原创 【leetcode题解】递归
本质:主问题->相同的子问题 子问题->相同的子问题。实现快速幂:1. 递归 2. 循环(二进制)递归就是函数自己调用自己(二叉树的遍历、快排、归并)仅需做一次深度优先遍历 后序遍历。的展开图,就是对一棵树进行一次。第一种视角:从宏观角度看待问题。第二种视角:将链表看作一棵树。中序遍历:只存在于二叉树中。解法:递归(重复的子问题)视角:宏观角度看待递归。
2025-03-26 10:55:10
616
原创 【leetcode题解】记忆化搜索
解法二:记忆化搜索 - 递归过程中将相同问题结果放入备忘录(带备忘录的递归)<可变参数,返回值>——用数组模拟哈希表(数组下标,nums[i])递归每次返回的时候,将结果放入备忘录。在每次进入递归的时候,在备忘录中查找。解法三:记忆化搜索->动态规划。解法三:记忆化搜索->动态规划。解法一:递归(时空复杂度大)解法一:暴搜(递归)——超时。解法二:暴搜->记忆化搜索。
2025-03-26 10:50:50
442
原创 【leetcode题解】优先级队列
1046. 最后一块石头的重量 - 力扣(LeetCode)解法一:暴力模拟(我自己的解法)return 0;解法二:大根堆模拟// 创建大根堆// 把所有石头放入堆中// 模拟。
2025-03-24 09:39:32
360
原创 【leetcode题解】链表
2. 把后面的部分逆序(反转链表:双指针;1. 找到链表的中间节点(快慢双指针)3. 合并两个链表(双指针)合并 K 个升序链表(困难)解法二:循环、迭代(模拟)解法一:暴力解法(不推荐)2. 链表中的常用操作。
2025-03-23 23:48:29
427
原创 【leetcode题解】宽搜(BFS)
相减之后,即使溢出,结果也是正确的(数据存储是环形的,距离不会溢出)即可 Collections.reverse();解法二:利用数组存储二叉树的方式(堆),给节点编号。细节:①用数组来实现队列,这样队头队尾比较好找。解法一:硬补 -> 超时、内存可能不够。解法:利用层序遍历,统计出每一层最大值。在每个树行中找最大值。
2025-03-23 21:00:14
277
原创 【leetcode题解】前缀和
(dp [ i ] 表示[ 1, i ] 区间内所有元素的和,即dp[ i ]=dp[ i - 1 ]+arr[ i ] )前缀和数组:f[ i ]表示[0,i-1]区间所有元素的和,f[ i ]=f[ i - 1 ]+nums[ i - 1 ]后缀和数组:g[ i ]表示[i+1,n-1]区间所有元素的和,g[ i ]=g[ i+1 ]+nums[ i+1 ]dp[ i ] [ j ] 表示:从[1,1]位置到[i , j]位置,这段区间里面所有元素的和。细节:f[0]=0,g[ n-1 ]=0。
2025-03-23 17:07:19
861
原创 【leetcode题解】双指针
1. a+b>c——>right-left个,right--找到一种结果之后,left和right指针要跳过重复元素。双指针算法:利用数组下标来充当指针。找到一种结果之后,不要“停”,缩小区间,继续寻找】使用完一次双指针算法之后,i也要跳过重复元素。:已处理的区间内,非零元素的最后一个位置。解法一:排序+暴力枚举+利用set去重。解法一:排序+暴力枚举+利用set去重。:利用单调性,使用双指针算法解决问题。利用单调性,使用双指针算法解决问题。:从左往右扫描数组,遍历数组。解法二:排序+双指针。
2025-03-23 00:39:03
770
原创 【leetcode题解】哈希表
哈希表是存储数据的容器,为了“快速”查找某个元素(时间复杂度为O(1),空间复杂度为O(n),解法:利用哈希表(使用数组模拟哈希表【仅需开辟2个哈希表,26个字符空间即可】)模拟简易哈希表(字符串中的“字符”;数据范围很小的时候)2. 如何分组<string,string[ ]>1. 判断两个字符串是否是字母异位词(排序)哈希表:1. 容器 2. 用。解法二:使用哈希表来做优化。的查找某个数时进行使用。解法一:利用排序函数。
2025-03-23 00:27:10
448
原创 【leetcode题解】位运算
:有0即0 |:有1即1 ^:相同为0,相异为1/无进位相加。解法二:高斯求和 return (5+1)(0+5)/2-sum。2. 给一个数n,确定它的二进制表示中的第x位是0还是1。解法一:哈希表(时空复杂度均为O(n))hash[26]将最右侧的1转为0,右边区域(包含1)全部取反。3. 将一个数n的二进制表示的第x位修改成1。4. 将一个数n的二进制表示的第x位修改成0。5. 提取一个数(n)二进制表示中最右侧的1。6. 干掉一个数(n)二进制表示中最右侧的1。
2025-03-23 00:20:28
919
原创 【leetcode题解】二分算法
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)解法一:暴力查找解法二:朴素二分查找区间左端点解题思路x<t时left=mid+1x≥t时right=mid查找区间左端点细节处理1. 循环条件为left<right,而不是left≤right(left=right的时候,就是最终结果,无需判断,若判断,则死循环)若使用left+(right-left+1)/2则死循环查找区间右端点解题思路x<t时left=midx≥t时right=mid-1查找区间右端点。
2025-03-22 19:21:46
1100
原创 【leetcode题解】贪心算法
在考虑最长递增子序列的“长度”的时候,不需要关心这个序列是什么样子,仅需关心“最后一个元素”是谁。解法一:动态规划 - 利用dp找到数组中最长递增子序列的长度,判断是否大于等于3即可。1. 前期学习的时候,把重点放在贪心的策略上,把这个策略当成经验吸收。本题的排序(优化):把数转化成字符串,然后拼接字符串,比较字典序。正常的排序本质(升序):确定元素的先后顺序,谁在前,谁在后。解法一:暴力解法->递归->记忆化搜索->动态规划(麻烦)净收益:diff = [-2,-2,-2,3,3]
2025-03-22 19:16:49
995
原创 【leetcode题解】二叉树中的DFS&&穷举vs暴搜vs回溯vs剪枝
深度优先遍历(DFS),是我们树或者图这样的数据结构中常用的一种遍历算法。这个算法会尽可能深的搜索树或者图的分支,直到一条路径上的所有结点都能被遍历完毕,然后回溯到上一层,继续找一条路遍历。在二叉树中,常见的深度优先遍历为:前序遍历、中序遍历、后序遍历因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅易理解而且代码简洁,并且前中后序三种遍历的唯一区别就是访问根节点的时机不同。本质就是。
2025-03-17 22:46:17
821
原创 【数据结构】哈希表Map&&Set
Map.Entry<k,v>是Map内部实现的用来存放<key,value>键值对映射关系的内部类,该内部类中主要提供了<key,value>的获取,value的设置以及key的比较方式。对于n个节点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是节点在二叉搜索树的深度的函数,即节点越深,比较次数越多。由于哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,因此冲突的发生是必然的,我们能做的就是降低冲突率。Set中的key不能修改,如果要修改,先将原来的删除掉,然后重新插入。
2025-03-13 00:02:34
1001
原创 【数据库】初识数据库
> age int default 3 ——插入数据时,age列的默认值为3。-> id int primary key, ——主键(不允许为空,不允许重复)准确的小数值,m是数字总个数(符号不算),d是小数点后个数,m最大值为65,d最大值为30.insert into 表名(列名,列名) values(值,值),(值,值),(值,值);insert into 表名(列名,列名) values(值,值);delete from 表名;
2024-11-01 23:56:13
937
1
原创 【数据结构】顺序表
数据结构是由“数据”和“结构”两词结合而来什么是数据?常见的数值1、2、3...教务系统里保存的用户信息(姓名、性别、年龄、学历等)、网页里肉眼可见的信息(文字、图片、视频等),这些都是数据什么是结构?当我们想要使用大量使用同一类型的数据时,通过手动定义大量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据的方式想要在草原上找到名叫“咩咩”的羊很难,但是从羊圈里找到1号羊就很简单,羊圈这样的结构有效将羊群组织起来。
2024-11-01 23:55:12
1103
原创 【数据库】
登录 mysql -uroot -p查看当前的数据库版本 select version();显示所有数据库 show databases;创建数据库 create [if not exists] database 数据库名 character set 字符编码集 collate 排序规则;选择数据库 use 数据库名查看当前数据库 select database();删除数据库 drop [if exists] database 数据库名;//危险操作。
2024-10-10 00:21:35
1123
原创 【数据结构】栈和队列
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。队列:只允许在一端进行插入数据操作,另一端进行删除数据操作的特殊线性表。操作的队列,deque是"double ended queue"的简称。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。如果使用单链表来实现栈,可以采用头插法入栈和出栈。出栈:栈的删除操作叫出栈,出数据在栈顶。
2024-09-06 18:52:55
660
原创 【数据结构】链表
但是,这句话只能执行一次,如果下一个还是key,将不会再执行这个if语句,所以要么将这个if改为while循环,要么将这个if放在该方法的最后(即,最后再处理head),执行完以后直接退出,且只针对于head.LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或删除元素时,不需要搬移元素,效率较高。此时,指针每移动一次,之间的距离就缩小一步,因此,在慢指针走完一圈之前,快指针肯定可以与慢指针相遇。
2024-09-02 22:06:28
804
原创 【数据结构】顺序表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就是说是连续的一条直线,但在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。
2024-08-17 18:11:29
622
原创 数据结构预备知识
Java集合框架又被称为container,是定义在java.util包下的一组接口interfaces和其实现类classes.主要表现为将多个元素element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即我们俗称的增删改查CEUD数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
2024-08-15 17:09:13
850
原创 异常(Java)
if (!throw new NameException("用户名错误异常");throw new PassWordException("密码错误异常");} else {System.out.println("登录成功!");try {PassWordException类:(自定义)public class PassWordException extends RuntimeException {//运行时异常super();
2024-08-07 14:27:17
781
原创 throw和throws的区别
throw是在代码块内的,即在捕获方法内的异常并抛出时用的,throws是针对方法的,即将方法的异常信息抛出去。可以理解为throw是主动(在方法内容里主动捕获并throw),而throws是被动(在方法上是没有捕获异常进行处理,直接throws)每个方法都必须要制定哪些异常不能处理,所以方法的调用者能够确保处理可能发生的异常,多个异常用逗号分隔。throw位于方法内部,可以作为单独语句使用,throws必须跟在方法参数列表后面。throw用在方法实现中,throws用在方法声明中。throw关键字用来。
2024-08-07 13:59:55
329
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人