自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 后端Web实战之登录认证,JWT令牌,过滤器Filter,拦截器Interceptor一篇文章so easy!!!

- 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行preHandle()方法,这个方法执行完成后需要返回一个布尔类型的值,如果返回true,就表示放行本次操作,才会继续访问controller中的方法;如果返回false,则不会放行(controller中的方法也不会执行)。

2025-04-28 14:38:27 1082

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(下)!附完整源码

如果部门下有员工,则不允许删除该部门,并给前端提示错误信息:对不起,当前部门下有员工,不能直接删除!我们看到响应数据的样例是一个集合,每个集合里面又有对应的键值对,所以我们可以想到通过。准备工作,和之前类似,先写好控制层,实现层,接口层及其实现方法层,以及各种实体类。我们响应的数据里有两个,所以我们可以考虑封装到一个记录结果的实体类中。这个不难,我们只需要在删除部门的时候新写一个逻辑判断就行。学员学历信息统计接口开发:参照接口文档 数据统计。班级人数统计接口开发:参照接口文档 数据统计。

2025-04-26 15:22:29 798

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(中)!

分页查询,相信大家再看了上一篇文章的学习之后都不陌生了,如果有些遗忘的话可以再去看看哦。准备工作,和之前类似,先写好控制层,实现层,接口层及其实现方法层,以及各种实体类。到此,关于学生管理的增删改查功能,我们就已经全部实现了。接口描述:该接口用于学员列表数据的条件分页查询。接口描述:该接口用于根据主键ID查询学员的信息。接口描述:该接口用于修改学员的数据信息。接口描述:该接口用于修改学员的数据信息。接口描述:该接口用于批量删除学员信息。接口描述:该接口用于添加学员信息。参照接口文档 学员管理。

2025-04-26 14:42:40 746

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(上)!

在修改班级的功能中,我们需要通过动态sql进行mapper层中的数据处理,因为我们修改的数据可以是一个,几个或者全部,动态sql可以更好的处理这些情况。因为需要查询班级下是否有学员,我们在开发的过程中可以先将这一部分留到学员管理开发的时候一起完成,这里因为是已经开发完的完整版本,我就不省略啦。我们分页查询的几个范围和条件就是根据班级名称,起始时间,结束时间进行查询,日期则是按照年月日的格式去查询 ,实体类如上,接下来我们看接口。在进行insert方法的时候,不需要去给id赋值,因为id是自增的,如下即可。

2025-04-26 13:34:15 1064

原创 不吃饭也要看的多线程教学,等待唤醒机制,生产者消费者模型,多线程的六种状态

概述生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。所谓生产者消费者问题,实际上主要是包含了两类线程:​ 一类是生产者线程用于生产数据​ 一类是消费者线程用于消费数据为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为Object类的等待和唤醒方法方法名说明。

2025-04-22 23:19:22 774

原创 蹲厕所也要看的一篇文章教你搞懂线程的安全问题,同步代码块,同步方法,locck锁,死锁!(详细上手)

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。如果你的代码是单线程,不用考虑多线程中数据安全的情况,直接用StringBuilder就行,如果需要考虑,就用StringBuffered。在图示中,线程一旦进入在休眠的时候就会退出,然后重新抢夺,最后在一起休眠的时候但是已经进入,就超过了100。如果你有多个锁,那你的进入进出就是不确定的,一个锁决定一个行为。

2025-04-22 20:41:16 725

原创 再遇见线程!一篇文章教你全部搞懂多线程,并发并行,优先级,各种成员方法,生命周期,干货多多哦

为完成特点的任务,用某种语言编写的一组指令的集合,简单来说就是我们的代码 线程是由进程创建的,是进程的一个实体,一个进程可以拥有多个线程,如下图。 下载的程序运行作为进程,进程里的三个下载对应三个线程。 每个进程拥有独立的内存空间,内存空间内变量不相互影响。 一个进程可以拥有多个线程,线程共享地址空间,线程之间相互影响。单线程:一个进程如果只有一条执行路径,则称为单线程程序​ 多线程:一个进程如果有多条执行路径,则称为多线程程序 总结:方法介绍实现步骤代码:多线程

2025-04-21 19:50:49 826

原创 热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串

可能有的朋友想,为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。此外我还定义了int型的sum变量来统计单一结果path里的总和,其实这个sum也可以不用,用target做相应的减法就可以了,最后如何target==0就说明找到符合的结果了,但为了代码逻辑清晰,我依然用了sum。(这两个参数可以放到函数参数里)

2025-04-20 20:22:36 670

原创 热门面试题第18天|Leetcode538.把二叉搜索树转换为累加树77题. 组合77.组合优化216.组合总和III17.电话号码的字母组合(开始回溯算法)

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]左右子树也必须是二叉搜索树。

2025-04-15 12:21:37 1014

原创 热门面试题第17天|Leetcode701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树

你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。这道题其实不难,我们不要被它看起来有效的很多种情况给唬住了,我们只需要遍历二叉搜索树,找到对应的地方添加节点,返回给上一级节点就行。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

2025-04-15 00:18:50 685

原创 热门面试题第16天|Leetcode530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 235. 二叉搜索树的最近公共祖先

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

2025-04-13 12:35:48 738

原创 热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索

其实这个最大二叉树的定义和二叉搜索树非常像,我们能想到的是先找到里面最大的节点,将其放在根节点,然后去它的左子树里面寻找,接着去右子树里面寻找,属于前序遍历。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。左中右,中序遍历找到最左边,最小的节点值,然后一层一层返回去判断当前节点值是否大于pre,一旦有一个节点不满足,就会返回false 然后向上返回回去。当根节点为空或者我们找到了对应值的节点的时候,我们直接返回就行。

2025-04-11 22:39:44 1162

原创 热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。

2025-03-25 23:50:37 784

原创 热门面试题第13天|Leetcode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

我们用StringBuilder来拼接字符串,然后我们开始循环遍历path将其存入sb中,注意不要遍历到最后一个元素,因为题目要求“->”,所以我们遍历到倒数第二个元素即可,然后将再单独添加卒子后一个元素,最后将拼接的sb添加给res,然后结束方法。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。当然是其左子树高度和其右子树高度的差值。节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。

2025-03-24 16:00:41 878

原创 热门面试题第12天|Leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 (内含热门面试题)

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。左节点,右节点分别为空时,我们只需要考虑另一边的最小深度的情况就行,两者都不为空的时候,我们在考虑取最小值+1。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。高度从下到上,深度从上到下,但是求最大深度,其实和求最大高度的结果是一样的。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。比较的是两个子树的里侧和外侧的元素是否相等。

2025-03-23 21:29:15 754

原创 热门面试题第11天|Leetcode刷题一篇文章教会你二叉树 递归遍历 迭代遍历层序遍历(内含热门面试题)

递归遍历 (必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单前序中左右,我们直接将中的val加入进,然后再递归左右子树即可后序和中序也是同理,只是顺序不同,但遍历的节点对象为null时,直接退出方法就行,我们直接看代码。迭代遍历我们来看迭代的思路我们在进行前序遍历的时候,按照的是中左右的顺序,思路如下我们从根节点开始读取,每读取一个根节点,将其存入栈,然后每次取出的时候将取出的节点的右左节点依次放进栈里面即可我们来看代码。

2025-03-13 22:34:52 566

原创 热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了,暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。

2025-03-09 20:58:13 985

原创 代码随想录算法训练营第九天|Leetcode 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

因为队列是先进先出,我们在push的时候直接将元素push进输入栈就可以,但是在pop或者peek的时候,如果输出栈为空,需要先将输入栈 的元素压入输出栈,再将输出栈的元素做对应的操作,这样才实现了先进先出的性质。在stackout里面有元素的时候,我们不用再将stackin的元素push进去,因为已经是按照顺序的,我们只需要等stackout的元素全部处理完再将stackin的元素处理即可。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2025-03-09 17:00:43 1230

原创 代码随想录算法训练营第八天|Leetcode 151.翻转字符串里的单词 卡码网:55.右旋转字符串 字符串总结 双指针回顾

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。我们这道题的思路是,先将整个字符串反转,结束之后再定位每一个单词,然后再将单词进行反转,思路为什么是这样子的呢。我们思路和之前一样,先整体反转,然后反转前n个字符,再反转剩余字符,为什么这样做呢,因为可以。建议:题解中的解法如果没接触过的话,应该会想不到。151.翻转字符串里的单词。卡码网:55.右旋转字符串。

2025-03-09 12:30:25 322

原创 代码随想录算法训练营第七天|Leetcode 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

先对数组进行扩容,在遍历字符串的时候出现数字字符就将长度+5处理,然后根据扩容的数组长度去new一个新数组,再将输入的字符读取进创建新数组对应的位置,再从后往前进行遍历,,碰到数字就从最后一位开始往前遍历,没碰到就把字符赋值给对应的位置。我们先理解一下题目意思,如图所示,在图中画了个字符串,令k=3,2k=6,我们将字符串的2k范围内的前k位进行翻转,然后再从2k+1的地方进行上述操作,如果长度<k,我们就不变,途中剩下gh均<k,所以我们需要反转。当然我们也可以用最基础的temp完成交换操作。

2025-03-05 20:54:34 409

原创 代码随想录算法训练营第六天|Leetcode454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

15. 三数之和建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。和之前我们遇到的两数之和不同,两数之和可以很快的通过哈希表完成作答两层for循环就可以确定 两个数值,可以使用哈希法来确定 第三个数 0-(a+b) 或者 0 - (a + c) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。

2025-03-05 16:54:54 937

原创 代码随想录算法训练营第五天|Leetcode1. 两数之和,349. 两个数组的交集242.有效的字母异位词 202. 快乐数(内含Hash知识点详解)

哈希数组更加适用于频繁查找和计数统计的操作,我们来看思路,我们创建两个hash数组,将两个输入数组中的值分别存入哈希数组中,这样数组的索引作为键,数组的值作为计数次数,然后我们得到了两个哈希数组,只要判断相同索引的两个哈希数组的值是否都大于0就行,如果都大于0,就说明这个元素是重复的,我们再创建一个动态数组吗,因为具备扩容的功能等,但是最后返回的时候还是需要创建一个普通数组,因为题目要求的返回方法是int,我们来看代码。建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。

2025-03-04 22:33:18 907

原创 代码随想录算法训练营第四天|Leetcode203.移除链表元素 707.设计链表 206.反转链表

24. 两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:我们通过图解看的更加清晰一点curr指向2,再指向1,再指向3,最后将这个绳子拉直,就达成凉凉交换 的效果还是需要一个哨兵节点,因为需要通过它定位后面的交换操作为了让相邻的两个节点交换,我们需要将前驱节点设置在最近节点之前,我们把这个结点成为curr,如果curr.next!

2025-03-03 00:00:49 863

原创 代码随想录算法训练营第三天|Leetcode203.移除链表元素 707.设计链表 206.反转链表

203.移除链表元素建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。我们心里一定要清楚一点,就是链表的删除操作需要知道前驱和后继,只有知道了这两点才可以进行删除操作,curr是指针,用来对链表进行操作。

2025-03-02 18:32:50 433

原创 代码随想录算法训练营第er天|Leetcode209.长度最小的子数组59.螺旋矩阵II

思路是滑动窗口,在数组的第一个元素位置有一个起始指针和一个终止指针,起始指针不用移动,终止指针依次移动,当每次移动终止指针的时候计算一下起始指针到终止指针的这段距离之间的元素和,大于等于sum的时候进入while循环,更新result为当前区间的数组长度和之前记录过的数组长度最小值,同时之间记录的总和要对应减少,然后再更新起始指针,最后返回result。,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

2025-03-01 21:17:18 274

原创 代码随想录算法训练营第一天|Leetcode704. 二分查找,27. 移除元素 977.有序数组的平方

704. 二分查找题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。代码实现(版本一)左闭右闭区间我在手撕这段代码的时候前面几次提交都报错超时,要注意把m写在循环外面这里左右都是闭区间,所以在二分更新节点的时候直接-+1,并且j和i可以相等。

2025-02-26 23:46:33 706

原创 二叉树的前中后序遍历(非递归)

我们先来看代码按照逻辑是先打印再压入栈,因为我们遍历完左边的时候,需要一步一步寻找遍历的路径找回去,为了记住来时路,我们需要通过栈来存储。我们将遍历的值直接打印并存储在栈里如图所示,我们先将1压入栈,然后陆续遍历2,4,接着我们当遍历到4之后发现left为null,我们再从栈中退出4去查找4的right,因为符合值左右,发现right没有,我们继续pop,发现2也没有right,直到pop到1有right然后进行右边的遍历,规则一样。

2024-12-03 14:14:46 402

原创 基础数据结构——双端队列

我们基于双向环形链表去实现双端队列。

2024-11-25 11:30:31 268

原创 实现根据roleid查找角色信息的功能

为了实现功能,我们需要添加三个类,一个是请求参数的数据传输对象DTO,一个是响应DTO类。

2024-11-13 21:09:21 217

原创 用环形数组实现队列(多种高级方法,由浅入深)

同普通数组实现的队列相比,普通数组的头结点和尾节点都是固定的,在进行移除的时候如果移除了一个节点,后面所有节点都需要进行移除操作,需要的时间复杂度更高在环形数组中,确定了头尾指针的环形数组很好地解决了这一点我们来看具体思路。

2024-11-07 20:15:12 1213

原创 基础数据结构——队列(链表实现)

和之前创建链表相同,我们需要设置一个哨兵头结点 此时它既是head也是tail。后面进行添加操作的之后将每次新加的节点设置为tail,并且指向head。我们在这个类中将每次构造的队列对象的tail节点都指向head节点。先来写队列类和它内部Node类。我们接下来实现队列的基本操作。接下来我们实现各个功能操作。

2024-11-07 16:53:05 485 1

原创 通过mybatisplus实现注册用户的接口基础上实现根据角色id查询功能

为了使 Spring Boot 程序能够在路径上通过查找用户的 ID 返回对应用户的信息,我们需要通过以下几个步骤修改代码。

2024-11-06 09:24:04 579

原创 通过mybatis和mybatis plus 实现用户注册功能和基础的增删改查

我们来看控制类。

2024-11-05 23:39:04 1069

原创 基础数据结构——栈(一篇博客教你搞定)

计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,可以移动的一端称为栈顶,另外一端不能操作的数据称为栈底,就如同子弹弹夹或者生活中的书可以理解为后进先出。

2024-11-05 15:18:52 978

原创 springboot入门学习笔记2(连接mysql,使用mybatis,plus等)

Service注解用于标识类是一个服务层组件。类扩展了类,这意味着它继承了 MyBatis-Plus 提供的服务层实现类的功能。类实现了接口,它必须提供接口中定义的所有方法的实现。

2024-10-30 08:00:00 1191

原创 springboot入门学习笔记

在我们创建了一个Springboot项目之后,我们会看到有很多文件夹和文件。

2024-10-26 22:45:57 1104

原创 一篇文章见你拿下多路递归——斐波那契问题

从第三个元素开始,每个元素的值等于前两个元素的和本质其实也是一个递归操作,话不多说我们直接上代码。上述代码不难理解,我们接着继续分析。

2024-10-18 11:33:07 426

原创 基础数据结构——插入排序递归

low为改数组中还没有排序的索引位置,t代表该索引位置的值我们只需要将low与前面排好序的数组比较,找到第一个比t小的值,将t排在它后面即可未排序部分不断缩小,直到i缩小到0或者low的前一位值已经比low的值小,此时退出查找我们来看代码。

2024-10-18 09:15:48 379

原创 喝水也要看的 Synchronized互斥锁,线程死锁,释放锁教学(内含线程零基础快速入门教学)

1,java语言中,引入了对象互斥锁的概念,来保证数据操作的完整性。2,每一个对象应该对应一个可称为“互斥锁”的标记,这个标记来保证在任一时刻,只能有一个线程访问该对象。3,当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问4,同步的局限性:导致程序的执行效率要降低5,同步方法(非静态)的锁可以是this,也可以是其他对象(要求是同一个对象)6,同步方法(静态的)的锁为当前类本身。

2024-10-16 09:33:06 1114

原创 吃饭也要看的守护线程,线程七大状态教学(内含零基础入门教学)

如果不了解的话没关系,可以先看进行学习。

2024-10-15 14:32:55 473

空空如也

空空如也

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

TA关注的人

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