自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 txpcg面经总结

spring security是怎么结合的,底层原理是什么了解吗Spring Security 是一个功能强大且灵活的身份验证和授权框架,它是建立在 Spring 框架之上的。用于保护企业级应用程序,包括身份验证、授权、攻击防范等功能。底层原理包括:过滤器链:核心就是过滤器链,由一系列的过滤器组成,每一个过滤器负责一个特定的任务,比如身份验证、授权、会话管理等。过滤器链会在用户发起请求时依次执行,每个过滤器都有机会对请求进行处理,直到最终的目标资源被访问或请求被拒绝。安全上下文:Spring Se

2024-04-05 22:11:49 451 1

原创 数组方法汇总

下面是链表的代码(slow.next=fast,就是改变的链表节点连接,而slow = slow.next则是移动的指针,走向下一个节点进行判断)

2024-04-05 18:34:36 535

原创 JVM总结

的对象作为起点,**从这些节点开始向下搜索,节点所走过的路径称为引用链,**当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。标记整理算法:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。每当有一个地方引用,计数器加1,引用失败,计数器减1,任何时候计数器为0的对象就不可能再被使用。

2024-04-03 21:17:00 805

原创 sql查询语法

select * from tb_emp where (entrydate,job) = (select entrydate , job from tb_emp where name = ‘韦一笑’);select * from tb_emp where dept_id in (select id from tb_dept where name = ‘教研部’ or name = ‘咨询部’);select entrydate , job from tb_emp where name = ‘韦一笑’;

2024-03-31 15:54:20 775

原创 mysql

这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据,这也就是脏读的由来(那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读(外键:其他表的主键,用于和其他表建立连接,外键可以是重复的,可以是空值,可以有多个,但是不推荐用,增加了复杂性和额外工作,分库分表的情况下是不能生效的。

2024-03-28 12:33:38 1608

原创 面经总结1

当解锁的时候,计数器减去1,如果减为0,则当前线程释放锁,清除持有者线程的引用。主要组件有broker(服务器节点)、topic(消息的逻辑分类,类似不同的帖子,一个topic可能有多个分区)、consumer(消息消费者)、consumergroup、zookeeper、producer(消息产生者)、controller(管理分区leader选取,只有一个)。虽然 Java 中的参数传递方式是值传递,**但对于对象引用来说,传递的是对象的地址值,所以在方法内部对对象的修改会影响原始对象。

2024-03-27 20:57:28 823 1

原创 leetcode 不同的二叉搜索树

然后初始化,dp[0]=1 dp[1]=1.dp[1]为1没什么好说的,根节点是1,只有一种情况。但是dp[0]=1,我们可以认为这是个空二叉搜索树,所以是1,也可以从遍历来判断,我们要的是乘积和,如果有一个元素是0,那么我们其中一部分的乘积就为0了,这就会导致结果丢失,所以要初始化为1.也就是说 此时dp[i]=dp[j-1]*dp[i-j]。dp[i]我们定义为以1到i为根节点,其二叉搜索树的个数,假设此时根节点为j,那么其左子树的头节点最大只能是j-1,右子树应该是i-j。

2024-03-19 14:27:07 347

原创 leetcode判断子序列

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1(如果不理解,在回看一下dp[i][j]的定义)if (s[i - 1]!= t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

2024-03-14 16:14:58 359

原创 牛客网 牛群消息传递

我们这里可以先按照空格分割,然后将字符串数组翻转成新的数组,然后我们用stringbuilder进行拼接,或者我们可以用stringjoiner来指定分隔符来进行拼接。之后我们需要用trim()函数去掉首尾的空格!然后再把多余的空格替换掉。本题中,就是要将字符串数组翻转,我们需要注意,题中说单词之间需要一个空格并且单词之间空格不能多于一个,通过正则表达式,其中\s+表示匹配一个或多个连续的空白字符包括空格、制表符、换行符等),

2024-03-14 15:43:31 141

原创 牛客网 华为机试 字符串排序

本题看似要求很多,但实际上,我们只需要考虑字母和非字母就可以了,字母中忽略大小写按照A-Z的顺序排序,而如果是同一个字母的大小写同时出现,按照输入顺序排,这里我们可以直接用list.sort(new comparator),

2024-03-14 10:40:06 141

原创 leetcode 147 LRU

本题其实就是需要实现LRU算法,并且要求复杂度是O(1),所以我们就需要结合数据结构来思考,我们可以采用双向链表+哈希表的结构,通过hashmap的key添加元素key,value添加双向链表的节点,其中节点用来存储题中给的值。这里需要注意,如果我们要添加元素,首先需要判断容量是否够,如果不够,则需要删除最底下的书,如果够则需要判断是否已经存在这本书,如果不存在直接添加,存在则需要把之前的书给覆盖掉。题目中的dummy节点其实就是双向链表的虚拟头节点,可以说通过它把双向链表变成了双向循环链表!

2024-03-13 20:17:16 271

原创 java 基础知识点

hashcode是object类的方法,任何类中都包含,hashCode() 和 equals()都是用于比较两个对象是否相等。重写equals方法必须重写hashcode方法,如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。先比较hashcode值,在用equals(),hashcode值不一样肯定不相等,如果hashcode值一样,在用equals,才能确定是不是相等。,分别用于接口和类中。

2024-03-13 12:50:20 584

原创 阿里云第一次面试记录

Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。模板方法模式(Template Method Pattern):定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变该算法的结构即可重新定义该算法的某些特定步骤。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。

2024-03-12 18:50:41 2861

原创 java guide 八股

string是不可变的(String 类中使用 final 关键字修饰字符数组来保存字符串,所以不可改变),其是线程安全的,stringbuffer也是线程安全的,但stringbuilder不是线程安全的,但其性能有提升。成员变量是属于类的,局部变量是方法内的,成员变量可以被public、private、static进行修饰,可以被外部访问,但成员变量不可以。try块:用于捕获异常。String 中的 equals 方法是被重写过的,因为 Object 的 equals 方法是比较的对象的内存地址,

2024-03-11 14:26:30 1253

原创 牛客网 华为机试 合唱队

当nums[i]>nums[j]的时候(i>j),此时表示dp[i] = Math.max(dp[i],dp[j]+1)(dp就是left)。然后我们得到了right和left两个数组,此时我们要找到最大的合唱队长度,就是将right和left相加,找到结果最大的值(表示此时以nums[i]为中心,能够建立起最长的合唱队),但我们多加了一个i,因为right和left都包括了nums[i],所以我们要减去1才可以。然后我们用整体的人数减去我们得到的最大值,就得到了我们要求的出列的最少人数。

2024-03-08 14:53:29 334

原创 leetcode最长递增子序列

此时如果nums[i]>nums[j],可以说明,以nums[i]结尾的子序列,其递增子序列的长度是dp[j]+1,因为nums[i]>nums[j]。考虑最坏的情况,整个序列是个严格递减的序列,那么以nums[i]结尾的子序列,其dp[i]=1。打印数组:我们打印出来的dp数组是表示包含nums[i]在内的最长子序列的长度,但不一定是整个数组最长子序列的长度,比如题中的第一个例子,就不包含nums[nums.length-1]。dp数组定义:dp[i]表示以nums[i]结尾,此时最长递增子序列的长度。

2024-03-08 14:40:48 382

原创 计算机网络 八股

计算机网络体系结构OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

2024-03-07 19:26:29 2670

原创 牛客网 华为机试 坐标移动

例如**,“[a-z]” 表示匹配小写字母 “a” 到 “z” 中的任意一个字符。特殊字符:Java 中的正则表达式也支持一些特殊的元字符和修饰符,如 “.” 表示匹配除换行符外的任意字符,“\s” 表示匹配任意空白字符等。例如,“(abc|def)” 表示匹配 “abc” 或 “def”。“^” 表示匹配字符串的开头,“$” 表示匹配字符串的结尾。字符类:用方括号 “[]” 来定义一个字符类,表示可以匹配其中任意一个字符。,使其具有特殊的含义。例如,“.” 表示匹配实际的句点字符,而不是任意字符。

2024-03-07 18:50:58 441

原创 牛客网 华为笔试最小公倍数

本题是要求两个数的最小公倍数,那么我们考虑,如果一个数是两个数的最小公倍数,那它一定可以整除这两个数,同时,我们知道其中一个数字,是其因子,如果要想继续保持能够整除这个数,那么一定是这个数的倍数,那我们依次累加这个数,直到结果能够整除另一个数字即可。比如,5 和 7。我们以5为例,以5本身为例,依次往上加其本身(就是5)。5+5=10,但是10不是7的公倍数,再加5是15,还不是,再加20,还不是…当加到35的时候,就是7的倍数了,此时35就是5和7的公倍数。

2024-03-06 16:46:46 142

原创 牛客网 华为机试 数字颠倒

数学运算的方式是通过number不断的对10取余数,获取后面的数字,然后再乘以10得到倒序的数字 res = res*10+number%10;然后我们再把numuber = number/10;这样就能倒序获取number每一位的数字并转换成十进制。而采用系统函数的话可以将数字转换成stringbuffer类型,然后调用reverse函数,最后把数据类型转换成string类型直接输出就好。本题中,是要把输入的数字颠倒,本题可以采用数学运算的方式,也可以采用系统函数的方式。

2024-03-06 15:07:48 167

原创 牛客网 华为机试 字符个数统计

在本题中,我们要统计字符的个数并且去除掉重复元素,我们可以使用hashset集合,因为hashset是不包括重复元素的。然后我们只需要从头开始遍历这个字符串,依次将元素加入到hashset集合即可,最后返回集合的长度即可。注意:本题的关键是利用hashset集合不包括重复元素来去重。

2024-03-06 14:52:22 196

原创 牛客网 华为机试 提前不重复的整数

为了从右往左获取数字,我们可以把这个数对10取余,得到的余数就是其每一位的数。然后我们把得到的数字添加到hashset中,如果可以添加,就证明这个数字不是重复的。然后我们要把这个数字除以10,这样就能得到去掉最后一位的数字,以此类推即可。本题要求提取不重复的整数,然后倒序输出,我们可以采用hashset来存储结果,这样就能避免重复。

2024-03-06 14:38:27 116

原创 牛客网 华为机试 合并表记录

本题中,我们是要将表中记录的索引相同的进行合并,所以我们先建立一个size为输入数的哈希表,然后我们把键盘输入的值依次作为key和value存入到哈希表中即可,每次放入的时候先判断表中是否存在该key,如果存在则把value的值相加,如果不存在则直接存入即可。最后打印哈希表即可。

2024-03-06 13:25:52 160

原创 牛客网 华为机试 取近似值

本题是要实现四舍五入。我们采用float的数据类型,因为这样数据精度更高。然后我们可以把得到的数据+0.5,然后再转换成int数据类型,因为转换成int数据类型的时候是向下取整的,比如4.9转换成int就是4,4.2转换成int也是4。我们先加0.5,如果原数据小数点后面比0.5大,加上0.5之后会向上进1,然后取整之后就是近似数。如果比0.5小,加上之后也没有进1,之后转成int就会舍弃后面的小数。

2024-03-06 13:03:02 224

原创 牛客网 华为机试 质因子

比如7,它的平方根比2大,比3小,当到2的时候不能够整除,到3的时候已经比他的平方根要大了,直接返回7就好,它的质因子只有它的本身。本题中,我们不需要遍历到这个正整数,只需要到这个数的平方根就好,因为一个数的平方根乘以平方根等于这个数,这个数的因子一定有一个比平方根小,另一个比平方根大。比如2的因子只有1和2,3的因子只有1和3,5的因子只有1和5。比如题中的180,能被2整除,得到90,再被2整除得到45,再被3整除得到15,再被3整除得到5,最后5是质数,所以结果就是2 2 3 3 5。

2024-03-06 12:59:31 200

原创 牛客网 华为机试 进制转换

然后我们需要注意,字符串前面会有0X,这只是一个标识十六进制的标识符,没有具体数字意义,我们在转换的时候,需要把它去掉。比如,我们把1A转换成十进制应该是26。1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。然后我们需要知道,要想把十六进制转换成十进制,我们有递推公式。16+1=1 然后res = 1*16+10=26。

2024-03-06 12:14:31 336

原创 牛客网 计算某个字符出现的次数

在本题中,我们是要统计一个字符串中重复字母出现的次数,我们把输入的字母转换成小写,然后把字符串也都转换成小写,然后把字符串中包含字母的地方替换成空。然后直接用字符串减去替换完成的字符串,就是我们要统计的个数。

2024-03-05 15:31:50 258

原创 华为机试 字符串最后一个单词的长度

本题中,我们是要从键盘输入一个字符串,然后返回这个字符串最后一个单词的长度。所以我们需要scancer类。我们需要注意的是,hasnext()和hasnextline()这两个函数的区别。

2024-03-05 14:52:28 181

原创 java框架八股

第四,B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存中,这个是有两种情况:一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象。2创建bean的时候,第一步是调用构造函数实例化bean,第二步是bean的依赖注入,比如一些set方法注入,都是用@Autowire完成的。spring实现的事务本质就是aop,对方法前后进行拦截,在执行方法之前开启事务,在执行方法之后根据执行情况提交或者回滚事务。

2024-03-04 20:01:02 843

原创 leetcode最大二叉树

当我们的左右索引相差小于1的时候,证明二者走到了一起,这个时候我们直接返回null就可以了。在本题中,我们是要将给定的数组构成一个二叉树,其根节点是数组中最大的元素,左子树都是最大值左边元素组成的,右子树都是最大值右边元素组成的。首先确定我们需要的是函数的参数以及返回值,我们需要将数组传入,同时为了确保层层递归构建树,我们需要一个左边起始索引,右边起始索引。然后按照遍历顺序,中左右,首先建立起根节点,然后再递归根节点的左子树,再递归根节点的右子树即可。我们构造二叉树,一般是采用前序的遍历顺序(中左右)。

2024-03-04 15:39:41 263

原创 java 集合八股

第一:Arrays.asList转成list之后,如果修改了数组的内容,list会受影响,因为它底层使用的Arrays类中的一个内部类来构造的集合,在这个集合的构造器中,把我们传入的集合进行了包装,但最终都是指向的同一个内存地址。第二:List.toArray()转成数组之后,如果修改了list的内容,不会影响数组,因为底层是进行了数组的拷贝,跟原来的元素没有关系了,所以即使list修改,数组也不会受影响。2添加数据时,计算key的值确定元素在数组中的下标,key相同则替换,不同则存入链表或者红黑树中。

2024-03-03 18:42:40 730

原创 leetcode 移除链表元素

本题中,我们是要移除链表的某一个节点,为了确保统一操作,我们需要使用虚拟头节点,这样我们删除节点的时候,就是把这个要删除的节点(当前节点cur)的前一个节点pre,使得pre.next指向要删除节点的下一个节点,所以就是pre.next = cur.next。如果不是我们要删除的节点,那我们就移动pre指针,让其往后走,就是pre=cur。然后再切换当前节点的位置,cur = cur.next。

2024-03-03 15:56:13 240

原创 leetcode 长度最小的子数组

我们可以将for循环来控制快指针,也就是右指针,每次它都会向后移动,通过自行定义left指针,当窗口内部的元素和大于等于目标值的时候,我们就需要把左指针向右移动,改变窗口的大小,一直到for循环遍历结束输出结果即可。在本题中,我们可以知道,是要求数组中组成和为target的最小子数组的长度。所以,我们肯定可以想到用两层for循环进行遍历,然后枚举所有的结果进行挑选,但这样时间复杂度过高。一个快指针,一个慢指针,二者围成了一个窗口,符合条件的时候记录窗口的大小,然后继续往后移动指针。

2024-03-03 14:41:50 314

原创 leetcode移除元素

顾名思义,快慢指针是有两个指针,一直快指针,一个慢指针。在本题中,快慢指针起点都是0,开始的时候,当没有遇到要删除的元素的时候,快慢指针都一步一步向前走,此时即使二者替换也是一样的数据。遇到要删除的元素的时候,这个时候我们先不进行元素的替换,然后把慢指针留下,快指针向前走一步,此时二者之间出现了位移差。然后再继续向后走,如果不是要删除的元素,这时候把快指针位置的元素替换到慢指针的位置,此时就完成了指定元素的删除。注意,在本题中,是对原数组进行操作,需要原地删除指定元素,所以我们可以采用快慢指针来操作。

2024-03-03 13:14:27 280

原创 leetcode hot100 每日温度

本题我们考虑,将气温数组元素的下标存入栈中,首先初始化要把0放入,0是下标的意思。然后我们拿下标为1的元素也就是74和下标为0的元素比较,74>73,所以我们计算完二者的距离(下标的差值),然后把结果存到一个数组中。然后将下标0弹出栈,因为这个点的距离已经获取了,然后再将下标1压入栈中。在本题中,我们是通过单调栈来解决的,因为我们采用了栈的数据结构,并且,栈内存储的元素是单调的。如果遇到当前元素没有栈中的下标对应的元素大,直接将该下标压入栈中,继续往后比较。

2024-03-02 15:41:04 333

原创 java mysql八股

第二个是不可重复读:比如在一个事务内多次读同一数据,在这个事务还没有结束的时候,另一个事务也访问了这个数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。第一个是脏读:当一个事务正在访问数据并对数据进行了修改,而这种修改还没有提交到数据库,这时另一个事务也访问了这个数据,因为这个数据是还没有提交的数据,所以另一个事务读到的数据就是脏数据,如果数据库的使用场景读的操作比较多的时候,为了避免写的操作锁造成的性能影响,可以采用读写分离的架构。

2024-03-02 15:31:47 941

原创 leetcode hot100 买卖股票最佳时机3

dp[i][0]表示不操作,dp[i][1]表示在第i天第一次持有,dp[i][2]表示在第i天第一次不持有,dp[i][3]表示第i天第二次持有,dp[i][4]表示在第i天第二次不持有。本题中,依旧可以采用动态规划来进行解决,之前的两个题我们都是用二维数组dp[i][2]来表示的,其中i表示第i天,2表示长度为2,其中0表示不持有,1表示持有。dp[i][1]表示第i天第一次持有,可能是前一天就已经持有了,也可能是前一天没持有,然后当天第1次买入(第一次买入所以是-prices[i])。

2024-02-25 17:06:49 563

原创 leetcode hot100 买卖股票的最佳时机二

由于dp[i][0]表示第i天不持有股票,可能是第i-1天就没有股票,则是dp[i-1][0],也可能是第i-1天持有股票,然后第i天把股票卖了,则是dp[i-1][1]+prices[i]。dp[i][1]表示第i天持有股票,则可能是第i-1天就持有股票,dp[i-1][1],也可能是第i-1天没有股票,然后第i天买入的dp[i-1][0]-prices[i]。dp[0][1]表示第0天持有股票,则此时应该是-prices[0]dp[0][0]表示第0天不持有股票,则为0。

2024-02-25 16:20:35 305

原创 leetcode hot100 买卖股票的最佳时机1

那么,dp[i][0]表示第i天持有股票,那么i-1天可能持有股票,此时是dp[i-1][0],如果第i-1天没有持有股票,那一定是第i天买入的,第i天买入股票,由于开始的时候手里没有钱,当买入的时候,手里的金额是-price[i]。如果第i天不持有,就是dp[i][1] ,第i天不持有的话,可能是i-1天就不持有了,那么就是dp[i-1][1],也可能是第i天卖掉了,那么就是dp[i-1][0]+price[i]。注意,持有并不代表一定是当天买入!dp[0][1]表示第0天不持有股票,则一定是0.

2024-02-23 14:26:56 417

原创 leetcode hot100打家劫舍三

然后我们想根节点root,如果根节点偷,那么其子节点一定不能偷,所以root[0] = root.val+left[0]+right[0]。本题是相邻的节点不能偷,也就是一个被偷的节点的父节点和子节点都不能偷。上述的公式实际上是根节点(其实就是每次递归的时候的中间节点的处理逻辑),我们树的遍历顺序是后序,只有把左右节点的数据获取到才能进行判断,这也是我们为什么选择后序遍历的原因。动态规划是一直记录状态,我们可以根据动态规划的数组来记录变化的状态,最终求的自己想要的节点的状态。这才是其最根本的地方。

2024-02-23 12:37:25 316

空空如也

空空如也

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

TA关注的人

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