自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MyBatis(一)

MyBatis是持久层框架,是帮助我们更简单地操作和读取数据库的工具,其具体数据存储和数据操作还是在MySQL中进行的,因此,需要添加MySQL驱动。在使用MyBatis的过程中,我们可以借助日志,来观察 SQL语句的执行、传递的参数 和 执行结果,因此,我们来学习MyBatis日志打印。我们可以想到我们在学习MySQL时,可以给列名起别名,因此,我们可以通过起别名的方式,让别名 和 实体类属性名相同。在上述操作中,我们使用注解的方式来进行增删改查,在MyBatis中,也可以使用XML的方式来进行操作。

2024-04-27 09:00:00 755 5

原创 SpringBoot日志

日志级别是开发人员设置的,用来给开发人员看的,开发人员根据自己的理解来判断该信息的重要程度,若将ERROR级别的日志设置成INFO,很有可能会影响开发人员对项目运行情况的判断,当出现较多ERROR级别的日志信息时,也可能没有任何问题,测试的BUG级别更多的是依据现象和影响范围来判断。这些子系统可能是相互独立的模块,也可能是紧密相关的组件,子系统的具体实现对客户端是透明的,客户端只需要通过门面系统与子系统进行交互,而不需要了解子系统的内部实现细节。这样可以减少客户端与系统之间的交互,降低了系统的复杂度。

2024-04-21 08:44:41 1181 21

原创 SpringBoot配置文件

其中,yml 和 properties 的区别 类似与商品的新旧包装,properties类型的配置文件就属于旧包装,也就是是创建SpringBoot项目时默认的文件格式(仓库里还有库存),而yml属于新包装。我们可以发现: 当 .properties 和 .yml 共存时,两个配置文件都会加载,而当配置文件内容存在冲突时,其中,yml是yaml的简写,使用频率较高,yaml与yml的使用方式是。的,因此我们学习了yml文件的使用后,也就能够使用yaml文件。

2024-04-12 09:00:00 1068 20

原创 Spring IoC和DI

为什么要有这么多的类注解呢?这与 应用分层 类似,为了在看到类注解后,就能直接了解当前类的用途@Controller:控制层,接收请求,对请求进行处理,并进行响应@Service:业务逻辑层,处理具体的业务逻辑@Repository:数据访问层,也称为持久层,处理数据访问操作@Configuration:配置层,处理项目中的一些配置信息@Component:泛指组件,当组件不好归类时,可以使用这个注解。

2024-03-31 09:00:00 1057 19

原创 动态规划——回文串问题

本篇文章主要学习使用动态规划来解决回文串相关问题,我们通过相关练习来学习。

2024-03-31 09:00:00 1132 28

原创 动态规划——路径问题

指在一个给定的网格中,从起点到终点有多条可能的路径,每条路径都有一个特定的权重或成本,动态规划路径问题的目标是找到一条路径使得其总权重或成本最小或最大化。在解决这类问题时,通常会使用动态规划算法,通过逐步计算子问题的最优解来找到整体问题的最优解。接下来,我们通过一些练习来进一步体会路径问题及其解决方法。

2024-03-25 09:00:00 1282 12

原创 动态规划——斐波那契问题(Java)

是一种常见的算法设计技巧,通常用于解决具有重叠子问题和最优子结构的问题。在动态规划中,将原问题分解成若干子问题,通过求解子问题的最优解来得到原问题的最优解。如何用动态规划解决问题?我们可以通过一下5步来解决动态规划问题1. 确定状态表示什么是状态表示?指在解决问题时所需要考虑和记录的关键信息。这些状态可以是问题的某种属性或特征,通过对这些状态的定义和记录,可以更好地理解问题的结构,从而设计出高效的动态规划算法。

2024-03-23 09:00:00 1713 26

原创 宽度优先搜索算法(BFS)

先从左向右,再从右向左地对每一层节点进行遍历以示例1为例:即。

2024-03-10 09:00:00 1854 36

原创 算法中栈的应用

即可得出结果:因此,我们可以使用一个栈来保存进行乘除运算后的值:当运算符为加号时,直接将加号后的元素num放入栈中当运算符是减号时,我们将减号后的元素num的。

2024-03-05 09:00:00 1178 28

原创 哈希表在算法题目中的应用(Java)

在本篇文章中,我们重点讲解哈希表在算法题目中的应用

2024-02-28 09:00:00 1441 17

原创 分治算法总结(Java)

即分而治之。也就是将一个大的问题拆分为若干个小问题,然后递归解决每个小问题,最终合并每个小问题的解得到原问题的解分治算法一般包含 三步:1. 分割问题:将原问题分割为若干子问题,这些子问题应该是相互独立的,并且和原问题具有相同的结构。2. 解决子问题:递归解决每个子问题,当子问题足够小时,直接求解3. 合并子问题的解:将子问题的解合并成原问题的解。分治的思想体现在 快速排序、归并、二分查找等 中,在本篇文章中,我们重点讲解其在 快速排序和 归并 中的使用。

2024-02-21 09:00:00 1804 29

原创 UDP协议

(User Datagram Protocol 即用户数据报协议)是传输层的重要协议之一(还有一个重要协议是TCP)

2024-02-18 21:30:00 794 24

原创 模拟算法总结(Java)

模拟:根据题目要求的实现过程进行编程模拟,即题目要求什么就实现什么1. 根据题目要求模拟算法流程2. 将算法流程转换为代码接下来,我们以几道练习来进一步理解和掌握模拟算法。

2024-02-16 09:00:00 2339 10

原创 位运算总结(Java)

关于位运算操作的总结和相关练习题目详解

2024-02-14 09:16:04 942 11

原创 回显服务器(基于TCP)

在学习了基于UDP实现的回显服务器后,我们学习基于TCP实现的回显服务器。

2024-02-13 09:00:00 902 11

原创 回显服务器(基于UDP)

这是因为对于客户端来说,无法保证手动指定的端口是可用的,因此由系统随机分配一个空闲的端口号,而对于服务器端口来说,我们事先知道服务器上有哪些端口被使用,因此我们可以确保指定的端口未被占用,此外,客户端要主动给服务器发起请求,通过服务器端口号找到服务器,若服务器端口号也随机分配,则客户端不能找到服务器。在实现服务器过程中我们需要注意的是,由于服务器要等到客户端发送请求时才能进行接收、解析、计算响应等操作,而服务器不知道客户端什么时候发送请求,因此服务器需要一直“待命”,等待客户端发送请求。

2024-01-30 09:00:00 1390 18

原创 Java文件操作

数据流是一串连续的数据集合,就像水池里的水流,在一端水管供水(即写数据),在另一端水管出水(即读数据)。在写入数据时,可以一点一点或一段一段地写入,这些数据会按照先后顺序形成一个长的数据流,则在读取数据时,可以读取任意长度的数据Java标准库对流进行了一系列的封装,提供了一系列类来完成这些工作,而这些类大体可以分为两大类:1.

2024-01-26 09:00:00 1200 27

原创 线程安全的集合类

的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。,当读取顺序表时,此时无线程安全问题,而当有线程要修改其中的值时,就会将list复制一份,修改新表中的内容,并修改引用的指向(操作是原子的,无需加锁)因此,针对读取操作,无需加锁,不同链表的操作,也无需加锁,而当针对同一链表操作时,需要加锁,此时,我们可以考虑使用。哈希表中本就需要有数组,数组的元素都是已经存在的(每个链表的头节点),此时,只需。

2024-01-18 09:00:00 1231 31

原创 JUC的常见类

即,其中存放了一些进行多线程编程时有用的类。

2024-01-17 09:00:00 1900 12

原创 AVL树(Java)

目录一、什么是AVL树二、AVL树的实现AVL树的节点AVL树的插入AVL树的旋转右单旋左单旋左右双旋 右左双旋AVL树的验证三、AVL树的性能分析在了解什么是AVL树之前,我们先回顾二叉搜索树的概念二叉搜索树(二叉排序树),它或是一棵空树,或具有以下性质:根据二叉搜索树的性质,我们可以发现:1. 二叉搜索树中最左侧的节点是树中最小的节点,最右侧的节点是树中最大的节点2. 若采用中序遍历二叉搜索树,则可得到一个有序的序列二叉搜索树最主要的作用就是用于进行查询:当二叉搜索树是一颗完全二叉树时:其查询的平均查找

2024-01-13 09:00:00 2781 25

原创 常见锁策略

即加锁过程(处理冲突时)时的处理方式。

2024-01-09 09:00:00 1334 23

原创 和可被K整除的子数组(Java详解)

类似于数学中的数列前n项和。即从首元素位置到i位置这个区间内所有元素之和,前缀和只是一种思路,其不仅可以求和,也可以求从首元素位置到i位置区间内的乘积等等。我们以示例1为例子,先求前缀和数组,再通过前缀和数组来求解子数组,然而,在这种情况下,当我们求解子数组时,仍然需要后遍历,求得从i到j位置的元素之和,再判断其是否符合条件,其时间复杂度仍是O(在通过前缀和数组求解子数组时,我们可以考虑向前遍历,即。

2024-01-08 09:00:00 1226 16

原创 Java线程池

线程池能够存储一定数量的线程,当我们需要时,就从池中取出使用,用完再还给线程池。为什么要使用线程池?线程池能够减少每次启动、销毁线程的损耗,同时,在执行任务时,不需要等待线程创建就可直接执行,提高了响应速度,此外,由线程池统一调度和分配线程,有利于线程的管理。

2024-01-07 09:00:00 963 22

原创 Java定时器

即在设定的时间时执行某事的设备(例如闹钟,在指定的时间响铃),Java中的定时器会在到达设定的时间后,执行指定的代码Java标准库中提供了一个定时器Timer类供我们使用,位于java.util中。

2023-12-31 09:00:00 2660 28

原创 最小覆盖子串(Java详解)

来解决本题,即使用left 和 right 两个指针维护一个窗口,窗口中不包含 t 中所有字符时,right向右滑动,添加新的字符,当窗口中包含 t 中所有字符时,判断并更新最小子串,再将left 向右滑动,移除左边元素。每次记录子串的长度,并更新记录的最短子串,当i 遍历完 s 时,找到最小子串,由于当 i 找到 t 中字符时,要使用 j 向后遍历,找到子串,因此,暴力枚举的时间复杂度为O(此时,虽然A为t中字符,但窗口中A的个数大于 t 中A的个数,此时的字符A不能判断为有效字符。

2023-12-27 09:00:00 1530 21

原创 Java阻塞队列

阻塞队列(Blocking Queue)是一种特殊的队列,因其为队列,因此遵循“先进先出”的原则,此外,其是一种线程安全的数据结构,具有以下两点特性:1. 当队列满时,继续入队列就会阻塞,直到有线程将元素从队列中取出2. 当队列空时,继续出队列就会阻塞,直到有线程向队列中插入元素阻塞队列常用于“生产者消费者模型什么是“生产者消费者模型”?“生产者消费者模式”是一种典型的开发模型,通过一个容器来解决生产者和消费者的强耦合问题向队列中添加元素的线程向队列中取出元素的线程。

2023-12-23 09:00:00 1224 18

原创 在排序数组中查找元素的第一个和最后一个位置(Java详解)

若mid指向的元素落在右边区间,此时nums[mid]大于等于target,需要更新right的值,由于要找的结果(target第一次出现的位置)在此区间内,即mid所指向的位置可能就是最终结果,因此不能将right更新为mid - 1,而应更新为mid。上图中,当选择右边元素作为中间元素时,mid指向的元素落在右边区间,此时将right更新为mid,再求mid,此时mid仍为指向刚才位置,即落在右边区间,此时再次更新right为mid,再次求mid... 从而死循环。然而,题目要求我们实现时间复杂度为。

2023-12-17 19:07:58 1068 31

原创 单例模式:饿汉模式、懒汉模式

单例模式是Java中的设计模式之一,能够保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例单例模式有很多实现方式,最常见的是饿汉和懒汉两种模式。

2023-12-14 17:55:50 612 14

原创 长度最小的子数组(Java详解)

滑动窗口是一种基于。

2023-12-03 22:15:08 1052 32

原创 左孩子右兄弟(Java详解)

目录一、题目描述二、题解对于一棵多叉树,我们可以通过“左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含N 个结点的多叉树,结点从1 至N 编号,其中1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过“左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为0 。输入描述:输出描述:示例:输入:输出:思路分析

2023-11-24 20:51:39 604 31

原创 阿坤老师的独特瓷器(Java详解)

当我们将瓷器以d从大到小进行排序,则表明瓷器A前面的所有瓷器的直径d都大于或等于A的直径d,此时,我们只需要判断瓷器的高度h,假设瓷器A前面的所有瓷器直径d都大于A的d(等于的情况后面会讨论),则瓷器A前面。当d相同时,若将h更大的瓷器B排在A前面,则瓷器高度的最大值max必定大于A,A被判断为不是“独特瓷器”,然而,A的d与B的d相同,不满足B的d和h都大于A,因此,A是“独特瓷器”。瓷器的h大于A的h,则表明A不是“独特瓷器”,此时我们只需以。题目要求我们计算出“独特瓷器”的个数,而“独特瓷器”是指。

2023-11-19 22:48:23 405 21

原创 (头哥)多表查询与子查询

而任务要求查询每门课程的选课人数,则需要使用分组查询,分组的依据为课程号,且题目还要求没有学生选的课程也要显示,因此我们不能使用内连接来查询,而要使用。),再通过课程号找到选修了“数据结构”的学生学号(在sc表中查询选修课程为“数据结构”课程号的学生),从而查询出选修了“数据结构”课程的学生名单。要找出每个学生超过他所有的选修课程的平均成绩的课程,我们首先要求出学生所选修课程的平均成绩,再找出其超出平均成绩的课程,因此我们可以使用。查询选修了“数据结构”课程的学生名单,显示sno、sn,按学号升序排序。

2023-11-12 20:43:13 920 28

原创 乘积尾零(Java详解)

若直接相乘最后求乘积的末尾有多少个零,由于相乘所得数据太大,会导致溢出,因此不能通过直接求所有数乘积的方法来求得尾零个数,那该如何求出尾零的个数呢?使用计数器count统计尾零的个数,遍历这100个数,每乘上一个数就统计其尾零的个数,计数器相加,并去除尾零,再将结果%10000,去除前面的位数。,我们使用计数器count加上结果末尾的零后,就可将尾部的零去除,用去除末尾零后的结果继续计算。但即使如此,因为相乘的100个数较大,每次去除零后再相乘,结果也很大,也可能会溢出,由于。,因此我们可以将结果。

2023-11-10 20:50:38 365 23

原创 前K个高频单词(Java详解)

给定一个单词列表words和一个整数k,返回前k个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,排序。"i" 和 "love" 为出现次数最多的两个单词,均为2次。注意,按字母顺序 "i" 在 "love" 之前。"the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,出现次数依次为 4, 3, 2 和 1 次。

2023-11-04 13:10:35 909 32

原创 随机链表的复制(Java详解)

遍历原链表,根据原链表节点cur的next、random找到新链表节点node的next、random指向,并确定新链表的next、random。通过原链表节点找到新链表节点:map.get(cur),新链表节点的random:map.get(cur).random。通过原链表节点找到新链表节点:map.get(cur),新链表节点的next:map.get(cur).next。根据原链表节点的值创建新链表,并把原链表的节点和创建的新链表节点放入哈希表。通过原链表的头节点,找到新链表的头节点,并返回。

2023-10-30 21:45:07 260 37

原创 二叉搜索树

若二叉搜索树不为空树,由二叉树的性质(左子树上的所有节点的值都小于根节点的值,右子树上的所有节点的值都大于根节点的值),可通过比较插入节点和当前节点cur的值,找到插入节点的位置。找到插入节点的位置后,要通过cur的父亲节点将插入节点连接起来,因此我们可以定义一个parent节点,指向cur的父亲节点,来帮助我们插入节点。= root 且 cur = parent.right,则parent.right = cur.right。(即右子树中最左的数据),用找到的值替换掉cur,再删除找到的值。

2023-10-24 21:19:10 160 25

原创 Java另一棵树的子树

(2)若两棵二叉树都不为空,再判断其根节点的值是否相同,若不相同,两棵二叉树不相同;若不相同,则判断root的左子树是否与subRoot是否相同,若相同,则subRoot是root的子树;若不同,判断root的右子树是否与subRoot相同,若相同,subRoot是root的子树;我们首先判断两棵二叉树是否相同,若相同,则subRoot是root的子树;(1)若subRoot为空,则subRoot为root的子树,返回true。(2)若root为空,则subRoot不为root的子树。

2023-10-09 11:43:26 572 36

原创 Java循环队列

在线性队列中,一旦队列满了,即使队列的前面有空间,我们也不能插入下一个元素,这时,我们可以使用循环队列,来使用这些空间存储新的值。首先判断队列是否已满,若已满,添加失败,返回false,若没有,则在队尾rear位置添加数据,并将rear向后移动。首先判断队列是否为空,若为空,队列中无元素,抛出异常,若不为空,返回队头元素,并将front向后移动。首先判断队列是否为空,若为空,删除失败,返回false,若不为空,则将front向后移动。只能在一端进行插入数据操作,另一端进行删除数据操作的特殊线性表,是一种。

2023-10-06 14:37:17 595 27

原创 Java栈的压入、弹出序列(详解)

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。4.遍历完pushV数组后,判断p的大小,若p为0,则表示所有元素都已出栈,出栈序列为正确的出栈顺序,返回true,否则,返回false。2.使用i、j来遍历pushV、popV数组,pushV[p](栈顶元素)不等于当前出栈数组中元素,入栈:pushV[p](栈顶元素)不等于当前出栈数组中元素,p++(入栈)3.栈顶元素等于popV数组当前元素时,出栈。

2023-10-02 11:31:46 270 15

原创 Java括号匹配

若栈中无元素可以弹出,则无能与该右括号匹配的左括号,返回false,若栈为空,则表示所有的左括号都与相同类型的右括号匹配,返回true。若栈不为空,则表明还有未匹配的左括号,返回false,,就将栈顶元素弹出,判断是否是与其匹配的左括号,若是与其匹配的左括号,则继续遍历下一个字符。若不是与其匹配的左括号,返回false,,判断字符串是否有效。输入:s = "()"输入:s = "(]"

2023-09-27 21:20:19 495 29

空空如也

空空如也

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

TA关注的人

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