自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 系统学习算法 专题十七 栈

这类表达式求值的题,全部都用栈来解决,也是一种标识,这道题属于表达式求值比较简单的一道,里面没有括号,因此运算顺序就是乘除在前,加减在后,需要一个整型的栈和一个字符变量op和一个整型变量tmp,字符变量默认为 '+' 号,整型变量默认为0。按照入栈顺序进行入栈,如果入栈元素等于此时该出栈的元素,那么就进行出栈,因为出栈后可能出现连续出栈,所以要循环判断是否该出栈,直到不该出栈后,再进行入栈。如果第1个字符和第2个字符相同,删除后,没有第0个字符,此时则需要特判一下,则直接回退到删除字符后的第一个字符即可。

2025-08-17 23:14:27 596

原创 系统学习算法:专题十六 字符串

字符串的题也基本就是模拟以及各种算法的杂糅,主要要掌握一些常见的Java自带的字符串封装好的方法。

2025-08-03 23:40:12 951

原创 HTTPS的概念和工作过程

要传输的内容叫做明文,明文经过加密,再看到的就是密文解密则是将密文经过解密,得到的就是明文而加密和解密的过程中,往往需要密钥而密钥又往往分为公钥和私钥,公钥是公开的,大家都知道的,而私钥则是私密的,别人不知道的,公钥是由私钥推导而生成的。

2025-08-03 21:03:18 844

原创 系统学习算法:专题十五 哈希表

哈希表好用且非常强大,要熟悉其常用的方法,如果key的范围有限,那么就可以考虑用数组模拟,比哈希表效率要更高些。

2025-07-29 22:44:59 682

原创 系统学习算法:专题十四 链表

既然是比较大小进行排序,那么就可以借助优先级队列来实现,将每个链表的头结点都扔进去,取出堆顶元素,就是所有头结点中最小的,然后对应的那个链表就扔下一个结点进去,然后再取堆顶元素,循环往复,直到对应链表为空,则停止添加,最后当堆为空时,则合并完成。题意很简单,就是模拟加法的操作,只不过链表是逆序的,但是不要看是逆序的就觉得有难度,如果是正序的反而要更难一点,因为加法是从低位开始计算的,而逆序链表刚好就把低位放在了头结点,反而更好操作,而正序链表如果要进行加法,反而要先逆序再操作。

2025-07-23 23:42:09 802

原创 加密/加盐的介绍和使用

这样经过混合后的字符串,再继续加密,那么安全性就很高了,除此之外还能保护那些设置密码很简单的用户,比如123456这样的密码,即使有两个用户都设置的是123456,因为盐值是随机的,所以加密后的明文也是不一样的,这就导致了即使是相同的密码,但是加密后的明文却不一样。因此我们采用加盐的方法,来搅浑这一锅水,让黑客解密难度大大加强,即数据库存储的不是用户密码经过加密后的明文,而是用户密码与盐值混合后经过加密后的明文。而不同用户密码加密时的盐值是随机的,所以我们要保留盐值,这样才能实现。

2025-07-20 14:41:45 634

原创 JWT令牌技术的使用

首先了解一下什么是令牌,以及令牌的作用令牌其实就是用户身份的标识,本质上就是一个字符串,生活中最贴近的就是身份证,每个人买火车票飞机票,就需要出示身份证来验证身份,而身份证其中最重要的就是身份证号,就是那一长串的数字,刚好对应令牌的字符串之前学习的session和cookie也有身份验证的作用,为什么不继续使用呢,因为在企业中不止有一台服务器,而是有很多台,是集群环境。

2025-07-20 13:52:54 944

原创 Mybatis-Plus使用

如果mybatis-plus想要使用自定义SQL并结合条件构造器,则版本不能低于3.0.7其中在SQL语句中进行占位必须使用${ew.customSqlSegment}而方法参数中的构造器要么参数名为ew,要么在前面使用注解@Param(Constants.WRAPPER),而其中参数名为ew也可以等同于@Param("ew")实现也可以结合之前的动态sql实现多个参数进行构造sql语句。

2025-07-05 22:11:43 933

原创 SpringBoot 统一功能处理

首先当Tomcat启动后,会有一个核心的类DispatcherServlet,它会控制程序的执行顺序,其中调度方法为doDispatch,此时就会检查是否有拦截器,有的话就先执行拦截器的代码,然后再将请求转给Controller。

2025-07-04 19:22:47 780

原创 Spring事务和事务传播机制

在之前学MySql时学过,简单来说是一组操作的集合,是一个不可分割的操作,但之前只是纯数据库操作,并没有和Java联系起来,在Spring里面有两种事务操作分类:编程式事务,声明式事务,其中事务操作的步骤还是一样的,开启事务,然后提交事务或者回滚事务。

2025-07-03 22:36:10 960

原创 Spring AOP

AOP是Spring框架的第二大核心(第一大核心是IOC),全称翻译过来就是面向切面编程,其中切面就是指某一类特定问题,比如登录校验就是一类特定问题,而登录校验拦截器就是对登录校验这类问题的统一处理,所以拦截器就是AOP的一种应用简单来说,AOP是一种思想,是对某一类事情的集中处理,类似于针对某一种题型,提炼出来解决该题型的解题模板。

2025-07-02 22:14:59 610

原创 系统学习算法:动态规划(简单多状态dp)

所谓的多状态,就是不同选择,而我们要做的就是将一种选择描述清楚,通过添加各种定语来细分,如果某一个定语不够形容,那就再加一个定语,在代码上体现那就是升维或者开多个dp表,然后按照五个步骤解决即可。

2025-05-11 17:14:31 1106

原创 系统学习算法:动态规划(斐波那契+路径问题)

因为处于最左边和最上边的边界格子,在状态转移方程中会越界,所以要对此进行特殊处理,而在一维中是采用多开一个位置,即虚拟节点,而在二维中,往往会在左边多开一列,上边多开一行,那么边界情况就全部解决了,不会越界,而在起点dp[1][1]应该为1,所以可以直接给dp[1][1]赋值为1,也可以在dp[0][1]或者dp[1][0]赋值为1,然后dp[1][1]再通过状态转移方程赋值为1,都是可以的。

2025-05-06 22:21:42 1535

原创 系统学习算法:专题十二 记忆化搜索

其实难的不是记忆化搜索,而是如何写出暴搜的代码,也就是dfs,如果暴搜能过就过,过不了就看看能不能用记忆化搜索来优化,不是所有的暴搜都能转记忆化搜索的,要看是否存在相同的计算,如果有,那么就添加一个备忘录,dfs进去的时候就看一看备忘录,有就用,没有就算一次,然后再保存到备忘录,几乎是个模板,难的还是dfs综上所有递归回溯的部分就基本学完了,接下来会继续学其他的算法。

2025-02-24 23:34:42 694

原创 系统学习算法:专题十一 floodfill算法

floodfill算法简单来说就是求出相同性质的联通块比如在上面这个矩阵中,如果我们要求出所有负数的联通块,就可以使用floodfill算法,但联通必须是上下左右,斜对角的不行其中实现的方法有深度优先遍历(dfs)以及宽度优先遍历(bfs),这里主要使用的是dfs跟之前走迷宫的方法大致一样,难度不大其实跟之前也没什么太大的区别,主要学到了一个正难则反的思想,其他还是老样子。

2025-02-18 23:42:50 724 1

原创 系统学习算法:专题十 递归,搜索与回溯综合练习

至此所有的综合练习全部写完,应该对dfs有了更深刻的感受,其中重点是恢复现场,剪枝,画决策树,确定结束条件以及走迷宫类型的题,可以用映射关系来记录上下左右,同理也可以记录八个方向还有对角线和九宫格的写法基本也就是暴搜,思路不算太难,主要要有代码实现能力,能将决策树的思路转化为代码接下来还有floodfill和记忆化搜索两个小专题,学完就算大体地学完了递归,搜索和回溯这个大专题了,进行加油!

2025-02-16 13:25:26 1035

原创 系统学习算法:专题九 穷举vs暴搜vs深搜vs回溯vs剪枝

解决全排列,集合这种需要枚举许多情况并回溯的,先画出决策树,决策树不唯一,只要思路是对的,通过代码来实现,其中需要注意回溯后要恢复现场,最后就是正确的。

2025-02-04 20:04:16 1111

原创 系统学习算法: 专题八 二叉树中的深搜

深搜其实就是深度优先遍历(dfs),与此相对的还有宽度优先遍历(bfs)如果学完数据结构有点忘记,如下图,左边是dfs,右边是bfs而二叉树的前序,中序,后序遍历都可以使用递归来编写,而这三种遍历都属于dfs所以本质还是递归,只是换到了二叉树这个数据结构而已。

2025-02-02 21:40:19 1099

原创 系统学习算法: 专题七 递归

既然循环和递归可以相互转化,那么什么时候用循环写着舒服,什么时候用递归写着舒服当像左边这样有很多分支的话,就用递归舒服,像右边这样单边树就用循环比如遍历数组,它不会出现什么回溯,也没有其他多余的选择,就下标一直往后走就行了,就用循环很舒服像汉诺塔那道题,因为有三个柱子,所以往那边移动就有多个选择,选择的地方有很多,分支就多,很复杂,所以递归写着就很舒服。

2025-01-31 16:49:51 783

原创 系统学习算法:专题六 模拟

模拟算法其实也不叫算法,这类题就是题目告诉你具体流程是怎么样的,让你用代码来实现,思路上不怎么难,主要考察代码能力,将想转化成做,模拟题目的操作步骤,这就是模拟。

2025-01-25 18:45:38 716

原创 系统学习算法:专题五 位运算

1.这六种就是常见的位运算符,无进位相加就是在二进制中,两个数的某一位1和1可以进位,但是异或就不进位,相加后为0,跟相同为0,相异为1一个意思2.第一小类题型,第几位就用右移或左移操作符来控制,是0还是1就&1就能判断了3.第二小类题型,要修改成1,那么就 | 1就行了,修改哪一位就让1左移多少位即可4.第三小类题型,修改为0,那就是& 0即可,但是只是让第x位,所以其他位要为1,那么就只能让1左移x位,然后取反再按位与即可。

2025-01-22 19:48:43 759

原创 系统学习算法:专题四 前缀和

然后就来想优化,我们之前做过一道题,也是求和为k的子数组个数,在那一道题我们使用的是滑动窗口,这一道题好像跟那道题一模一样,但其实有一点区别,那就是之前那道题中数组的值全是正数,那么就具有单调性,而这道题的提示中写了数组中的值有正有负,所以就不能保证右边界往右滑动时是递增的,左边界往右滑动时是递减的,不具有单调性,所以这道题不能使用滑动窗口。在数学中,-1%2=1,即取模的值都为正数,而在Java中,-1%2=-1,所以这个是有矛盾的点,因此我们要将Java中取模操作后的值进行负转正,也就是统一返回正数。

2025-01-15 23:01:05 899

原创 MySQL事务(理论理解)

事务其实就是将一组SQL语句打包成为一个整体,而这组SQL语句要么全部执行成功,要么全部执行失败有什么用呢?举个简单的例子,我向你转钱,里面分为两个SQL语句,一个是我的钱减少,一个是你的钱增加,如果不使用事务,那么如果出现某些问题,导致只执行其中一个SQL语句,而另外一个SQL语句执行失败,那么就会发生两种情况:我的钱减少执行成功,你的钱增加执行失败,那么世界就莫名其妙少了一笔钱,我亏了,你也亏了我的钱减少执行失败,你的钱增加执行成功,那么世界就莫名其妙多了一笔钱,我赚了,你也赚了。

2024-12-09 18:07:41 581

原创 系统学习算法:专题三 二分查找

因为按照上面分析的过程中,left会跳出第一个区间,来到第二个区间的最左端点,而right不会跳出第二段区间,会来到第二个区间的最左端点,也就是说当left==right时,已经就是最后结果了,所有都判断查找完了,就没必要再进循环去判断,如果进入循环的话,那么就会命中第二种情况,即x>=t,那么此时right=mid就还是没有发生移动变化,这时就死循环了。当然总会觉得有些特殊情况没考虑到,比如0和1会不会不符合这个模板,其实将0和1带入代码,就会发现0根本就不进循环,直接就返回left,而left也是0。

2024-12-03 14:06:44 721

原创 系统学习算法: 专题二 滑动窗口

题目的意思也很简单,就是找到s字符串中涵盖t字符串所有字符的最小子串,还是先用暴力枚举的方法,大致理清操作步骤,定义left和right,left和right都从0开始,如果出现了t中的字符,对应计数器就++,然后right一直往右移动,直到最后一个字符,然后left往右移动一步,right又从left位置开始,继续往右移动,循环上面的步骤,直到left也到最后的字符位置。直到len-1开始切割。

2024-11-29 23:20:34 764

原创 数据结构:Map和Set(Java)

讲Map和Set这两个数据结构之前,我们要先了解一下搜索树的概念,因为TreeMap和TreeSet底层就是由搜索树实现的。

2024-11-27 00:20:10 833

原创 系统学习算法:专题一 双指针

至此,双指针算法就大致学习完毕了,我们来稍微总结一下双指针只是一种思路,并不是真正的指针,既可以用数组下标作为指针,也可以用值作为指针。

2024-11-04 23:20:12 974 2

原创 MySQL的约束和三大范式

这样看起来是断断续续的,但其实在生产环境下是很常见的,因为我们客户端insert的请求会发送到负载均衡器,而负载均衡器都会为每台服务器都预先分配一区段的主键值,比如DB-A这台服务器对应的主键值为1-10000,DB-B这台服务器对应的主键值为10001-20000,DB-C这台服务器对应的主键值为20001-30000……则如果给student表里面insert into(1,‘张三’,4)就会报错,因为class_id添加为4,但是class表中id那个字段没有4,只有1,2,3,所以不符合外键约束。

2024-11-04 10:42:30 829 1

原创 MySQL的增删查改(基础)一

其中order by 列名表示按照该列名的值进行排序,而ASC代表升序(从小到大往下排),DESC代表降序(从大到下往下排),注意的是desc这个关键字之前代表描述表,现在又代表降序,一个关键字代表了两个意思,这是MySQL不好的方面,当初设计的时候就没有很好的规范,我们要吸取这个教训,写代码的时候要注意一下命名规范。这里就是指定对应的字段插入后面对应的值,没有指定到的字段就使用的默认值,同时后面的值也不是像上面那样按照创建表时的字段的顺序来对应的了,而是按照前面指定字段的顺序来对应。),(值1,值2……

2024-09-28 18:25:43 1816 1

原创 MySQL数据库基础

每一个数据库都是由行和列组成的二维表格,其中要先创建列,也就是属性,再创建行,比如我们要创建一个保存学生数据的数据库,我们首先要确定我们需要保存学生的哪一些属性,毕竟我们不可能把学生全部所有信息都保存下来,这时我们就要根据需求,找到我们需要的属性,比如我们想要保存一个学生的姓名,学号,班级,那么我们在数据库中就要先创建这三列的属性,然后再根据每个学生的具体信息,一个学生对应一行数据行(也叫作数据记录),那么我们将所有的学生信息存入这个数据库后,我们就保存了所有学生的姓名,学号,班级在这个数据库中。

2024-09-28 15:48:53 1030

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

首先创建一个栈和顺序表,按照根左右的前序遍历顺序去遍历这棵树,一直往左孩子方向遍历,每遍历到一个结点就入栈并且加入到顺序表里,如果没有左孩子了,就拿出栈顶元素,看它是否有右孩子,如果有,又从右孩子开始,往左孩子方向遍历,如果没有,就继续拿出栈顶元素,如此循环,直到栈为空。当遍历到A,左孩子为null,此时A为栈顶元素,A有右孩子B,所以B入栈,然后B没有左右孩子,所以B出栈,此时A没有左孩子,A为栈顶元素,A有右孩子B,B又入栈,然后B没有左右孩子,B又出栈……但是这里有可能出现死循环,就是下图这种情况。

2024-08-29 21:42:33 371

原创 二叉树练习习题题集二(Java)

思路:从上到下,从左到右,先遍历到的先打印,可以用队列的特性“先进先出”实现,先放进根结点,并创建一个一维数组,然后求此时队列的个数size,每次弹出队列的一个元素放进一维数组,size--,如果size==0,就将这个一维数组放进存一维数组的一维数组,然后将不为null的左右孩子放进队列,如此循环即可。3.到“2”这个结点,将结点的值拼接,拼接"2",“2”这个结点有左孩子,拼接"(",然后递归到“4”这个结点,现在字符串为"1(2("1.按照前序遍历顺序,根结点直接拼接到字符串,现在字符串为"1"

2024-08-29 13:57:07 845

原创 二叉树练习习题集一(Java)

首先是有多组数据,所以要用hasnextLine()来读取,然后用一个变量i来遍历字符串,同时定义一个返回值为树结点的方法叫creatTree,在这个方法里,定义一个树结点初始为null,如果i对应的字符不是#,则创建对应字符的结点,i往后走一位,然后让该结点的左孩子等于创建左树,让该结点的右孩子创建右树。判断根结点的左右子树是否对称,主要看两个方面,一个是结构,然后是值,这跟上面那道判断是否是相同树的题类似,只不过传参的时候,一个传左子树的左孩子和右子树的右孩子,一个传左子树的右孩子和右子树的左孩子。

2024-08-17 20:02:42 989

原创 用栈实现队列

栈是先进后出,队列是先进先出,所以只靠一个栈是不能实现队列的,但是两个栈就可以,一个栈s1用来模拟入队列,一个栈s2用来出队列,当需要pop和peek时,如果s2为空,则将s1里的元素又放进s2,因为放进s1的时候是先进后出,所以s1放进s2的时候又是后进先出,这样操作,相当于负负得正了,最后s2的栈顶元素,就是最先入s1的元素。

2024-07-22 14:21:51 238

原创 用队列实现栈(Java)

q1,q2两个空队列,如果模拟入栈1 2 3,然后出栈,出栈元素为栈顶元素3,那么用队列实现就可以q1进队列1 2 3,然后将1 2入队列q2,3出队列,即第size-1个元素为栈顶元素;如果只是获取栈顶元素,则将1 2 3入队列q2,每一个元素入队列q2时,用一个变量记录下来,那么最后赋值给这个变量的元素就是最后的元素,也就是栈顶元素。如果后续要继续加入元素,则应该放进有元素的队列,然后每次pop或top,都将有元素的size-1或全部入到另一个空的队列,然后如此变换,一个为空,一个为非空。

2024-07-22 13:53:16 337

原创 栈练习习题集

当一开始栈都为空时,第一个元素放进去肯定是当前的最小值,最小栈放进该元素,然后当后面入栈的元素小于等于最小栈的栈顶元素,则放进最小栈里面,其中当等于时,也应该入栈,因为如果不入栈的话,那么该元素出栈后,会把最小栈原来的栈顶元素也出栈,但是这个栈顶元素保留的是之前的最小元素。而当1'==1入栈时,则最小栈有:3 1 1',那么当普通栈1'出栈时,最小栈也出栈1',此时普通栈为3 1,最小栈的栈顶元素为1,是普通栈的最小值,是正确的。1.是左括号时,就入栈,然后字符串继续遍历;

2024-07-20 15:52:05 594

原创 链表面试练习习题(Java)

首先判断是否有环,跟上面一题一样,接下来,如果有环,求出环的开始结点,还是快慢指针,快指针一次走两步,慢指针一次走一步,用两个公式表示快慢指针走的路程,其中C是环的长度,K是相遇点距离环的开始结点的长度,X表示头结点到环的开始结点的长度。法二:如果相交,那么相交之后的链表长度是相同的,所以两个链表长度的差值就等于相交前面的链表长度差值,因此只需要求出两个链表的长度,相减得出差值,让较长的链表先走差值步,然后再以相同的速度往后走,则相等时相交。1.fast走的路程S1:X+NC+C-K。

2024-07-18 18:46:29 508

原创 链表面试练习习题集(Java)

如果一开始头结点就等于val,即示例3的情况,那么按照上面的代码就不能将头结点移除,所以我们要判断一开始头结点是否为val,如果为val,则新头结点为头结点的后一个,因为移除完后的新头结点有可能仍然等于val,所以不是用if而是while,如果头结点为null,则说明全是val,如示例3的情况,此时就返回新头结点(也就是null)当结点为奇数个数时,刚好为中间的结点,当结点为偶数个数,为中间的第二个结点,根据快慢指针一个走两步,一个走一步,刚刚好都满足,所以就不用分类讨论了。

2024-07-17 20:33:14 780

原创 力扣88.合并两个有序数组(Java)

一般两个有序数组合并,都是从后往前赋值,因为两个数组中的最大值相比较出来的最大值,就是合并后的最大值,所以可以直接丢在最后面,然后如此类推,直到某一个数组被比较完,如果是第一个数组,则只需要将第二个数组剩下的直接赋值过去即可;如果是第二个数组,则不用管了,因为前面放的就是第一个数组的值。同时注意特殊情况,如果第一个数组的有效值为0个,合并后就是第二个数组,则只需要将第二个数组复制给第一个数组即可;如果第二个数组的有效值为0个,则不需要进行任何操作,合并后就是第一个数组。

2024-07-16 19:51:50 230

原创 力扣26.删除有序数组中的重复项(Java)

采用双指针,一个用来记录赋值到哪里,一个用来寻找哪个该赋值。

2024-07-16 19:45:24 111

空空如也

空空如也

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

TA关注的人

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