自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

双双博客

每个人都有自己的出场机会

  • 博客(41)
  • 问答 (1)
  • 收藏
  • 关注

原创 我要打败动态规划——编辑距离

392. 判断子序列1.题目给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。进阶:如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?示例 1:输入:s = "abc", t = "ahbgdc"输出:true

2022-01-29 10:13:01 671 14

原创 由浅入深带你手写LRU

我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量达到上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来,缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据,常用的淘汰算法有LRU,LFU,FIFOLRU简介LRU是Least Recently Used的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次使用,而最近最少被使用的数据,很大概率下一次不再用到,当缓存容量满的时候,优先淘汰最近最少使用的如下图所示,队列只能够存放5个元素当调用缓存获取key

2022-01-28 12:14:55 1184 8

原创 我要打败动态规划——回文串怎么搞?

动态规划一直是面试中的经典难题,所见体型常规的有:0-1背包,完全背包,打家劫舍,股票问题,编辑距离,回文串。后续的一段时间会对动态规划专题做出总结。647. 回文子串1.题目给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:s = "abc"输出:3解释:三个回文子串: "a", "

2022-01-28 10:43:27 970 13

原创 学完AQS源码自己实现一个锁

前几天学习了AQS源码为了加深印象今天来基于AQS自己实现一个锁1.基于AQS实现不可重入的锁之前我们学习了AQS的源码,了解到了自定义AQS需要实现重写一系列函数,还需要定义原子变量state的含义。下文我们自己实现一个锁,定义state为0表示锁没有被线程持有,state为1表示锁已经被某一个线程持有,由于是不可重入锁,所以不需要记录持有锁的线程获取锁的次数,另外,我们自定义的锁支持条件变量,因为我们要实现生产者——消费者模型class NonReentrantLock implements

2022-01-27 18:25:24 449 2

原创 波吉学源码——独占锁ReentrantLock源码剖析

ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而放入该锁的AQS阻塞队列里面ReentrantLock由AQS来实现,并且根据参数来决定其内部是公平锁还是非公平锁,默认是非公平锁其中Sync直接继承自AQS,它的子类分别实现了公平锁和非公平锁AQS的state状态值表示线程获取该锁的可重入次数,在默认情况下,state的值为0表示当前锁没有任何线程持有,当一个线程第一次获取该锁时会尝试使用CAS设置state值为1,如果CAS成功则当前线程获取

2022-01-27 15:22:04 483 9

原创 波吉学源码——AQS源码剖析

在了解AQS之前我们需要来认识一下这个工具类,因为该工具类是创建锁和其他同步类的基础LockSupport该工具类的主要作用是挂起和唤醒线程LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的,LockSupport是使用Unsafe类实现的,下面介绍几个重要的函数void park()public static void park() { UNSAFE.park(false, 0L);}如果调用park方

2022-01-25 13:06:01 560 11

原创 剑指 Offer 66. 构建乘积数组【java详细题解】

剑指 Offer 66. 构建乘积数组1. 题目​ 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 1000002. 思路遍历一遍内

2022-01-24 11:36:06 313 17

原创 剑指 Offer 41. 数据流中的中位数【java详细题解】

剑指 Offer 41. 数据流中的中位数1.题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返

2022-01-22 21:56:23 222 4

原创 波吉学源码——CopyOnWriteArrayList源码剖析

CopyOnWriteArrayList源码剖析​ 并发包中的并发List只有CopyOnWriteArrayList,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略在CopyOnWriteArrayList的类图中,每个CopyOnWriteArrayList对象里有一个array数组对对象用来存放具体元素,ReentrantLock独占锁对象用来保证同时每个线程对array修改。构

2022-01-22 15:29:01 683 13

原创 剑指 Offer 36. 二叉搜索树与双向链表【java详细题解】

剑指 Offer 36. 二叉搜索树与双向链表1.题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地

2022-01-21 11:16:55 141 8

原创 剑指 Offer 45. 把数组排成最小的数 【java详细题解】

剑指 Offer 45. 把数组排成最小的数1. 题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 02.思路这是一道排序题,

2022-01-21 10:03:18 280 11

原创 剑指 Offer 53 - I. 在排序数组中查找数字 I 【java详细题解】

剑指 Offer 53 - I. 在排序数组中查找数字 I题目统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0提示:0 <= nums.length <= 105-109 <= nums[i] <= 109nums 是一个非递减数组-109 <= target <=

2022-01-19 08:27:55 335 19

原创 由浅入深讲解哈夫曼树

由浅入深讲解哈夫曼树学前须知哈夫曼树相关的名词路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。下图中,从根结点到结点 a 之间的通路就是一条路径路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图中从根结点到结点 c 的路径长度为 3结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图中结点 a 的权为 7,结点的权为 5结点的带权路径长度:指的是从根结点到该

2022-01-10 11:06:30 763 24

原创 波吉学技术——了解JWT及整合Spring Boot

波吉用小半天时间学习一下热门的JWT,不然一直学底层也是蛮枯燥的嘛,感谢编程不良人的视频教学 B站传送门通俗讲JWTJWT简称JSON Web Token,也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,在数据传输过程中还可以完成数据加密、签名等相关处理JWT能做什么授权这是JWT的最常见方案,一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源,单点登录是当今广泛引用JWT的一项功能,因为它开销很小而且可.

2021-12-28 10:00:31 316 25

原创 波吉学设计模式——玩转单例模式

单例模式作为设计模式中最常见最重要的设计模式,今天波吉带你由浅入深的明白单例模式,相信你一定会有所收获的单例模式简介​ 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供了一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的方法权限设置为private,这样就不能用new操作符在类的外部产生类的对象了,但是类内部仍然可以产生该类的对象,因为在类的外部开始还没发得到类的对象,只能调用该类的某个.

2021-12-25 16:31:46 629 38

原创 JUC学习笔记(下)

继续分享总结的JUC学习笔记wait和sleep的区别sleep是Thread的静态方法,wait是Object方法sleep不会释放锁,它也不需要占用锁,wait会释放锁但调用它的前提是当前线程占有锁wait必须在同步代码块中Lock锁public class LockTest { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread((.

2021-12-23 15:26:40 815 11

原创 JUC学习笔记(上)

最近再看JUC的书和刷算法,把之前学习的JUC笔记总结一下整合的狂神和尚硅谷的JUC学习笔记进程和线程进程是计算机中的程序关于某数据集合上的一次运行活动是系统进行资源分配和调度的基本单位是操作系统结构的基础线程是操作系统能够进行调度的最小单位并发和并行并发并发的关键是你有处理多个任务的能力,不一定要同时,它们利用操作系统的CPU时间分片功能,其中每个任务运行其任务的一部分,然后进入等待状态。当第一个任务处于等待状态时,会将CPU分配给第二个任务以完成其一部分任务。对于单核(一个.

2021-12-22 09:35:42 213 32

原创 力扣周结07——贪心

455. 分发饼干解题思路贪心是从局部最优解出发得到全局最优解,贪心的题目的出发都是解出局部最优然后试着推出全局最优解且没有反例(这里其实是数学的思想,数学归纳法啥的,我也不太会),然后就可以按照贪心策略解题了,本题中对于大胃口的孩子我们喂大饼干就可以满足全局最优解核心代码class Solution { public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort

2021-12-21 10:13:13 212 28

原创 Java常用类

介绍了Java中常用类含StringBuffer,StringBuilder,String,时间API,Math和比较器

2021-12-15 09:26:59 264 27

原创 力扣周结06

力扣周结如期而至,本周开刷了贪心模块,贪心没有套路这五个字属实有点把我折磨的不轻,先将回溯模块整理一下77. 组合解题思路回溯三部曲递归函数的返回值以及参数并不需要对返回节点进行操作我们只是需要将符合条件的放到结果集中即可回溯函数终止条件终止条件就是path集合达到k就可以将节点回收单层的搜索逻辑剪枝优化回溯法是一种暴力检索方式,只能对其进行剪枝优化,对于本题的剪枝操作如果n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层.

2021-12-13 12:07:48 405 32

原创 ArrayList扩容机制JDK1.8

本题的所有的讲解都是基于JDK8这道题考察了ArrayList的构造器和对扩容机制的了解,本篇博客基于此出发讲解ArrayList的扩容机制想要做出这道题必须了解ArrayList的构造函数,ArrayList的构造函数总共有三个:ArrayList()构造一个空的数组。JDK7中构造一个初始容量为10的空列表但是JDK8中只是构造一个空的数组ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的数组,这些元素是按.

2021-12-10 19:34:12 985 47

原创 力扣周结05

本周的力扣周结我并没有刷很多的题,回溯模块最近才开始刷,先把树巩固好700. 二叉搜索树中的搜索解题思路利用二叉搜索树的性质去寻找指定值的结点(假设树中结点没有重复元素),二叉搜索树中根节点的左孩子一定小于其根节点,根节点的右孩子一定大于其根节点,因为我们需要返回指定的子树所以,我们递归函数的返回值不为空核心代码class Solution { public TreeNode searchBST(TreeNode root, int val) { //递归结束的标志是找.

2021-12-06 10:10:18 1334 47

原创 Java浅拷贝深拷贝

Java浅拷贝深拷贝浅拷贝和深拷贝涉及到了Object类中的clone()方法实现浅拷贝浅拷贝的实现需要类重写clone()方法浅拷贝会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象,导致两个对象的引用不等。实现浅拷贝很简单只需要将类实现Cloneable接口然后重写clone方法即可class Person imple

2021-12-05 21:16:50 2173 34

原创 力扣周结04——一入递归深似海

坚持打卡的感觉很棒!!收获满满每天都有必须早起的使命感!!十一月份也快结束了,我的力扣之旅也只是出现了一天的缺勤,希望下个月继续努力,一直坚持!!学会二叉树的递归遍历吊打这些题前序遍历递归public static void beforeSearch(Node node) { if (node != null) { System.out.print(node.value + " "); beforeSearch(node.leftNode);

2021-11-29 09:13:20 376 24

原创 力扣周结03

242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false提示:1 <= s.length, t.length <= 5 * 104s 和 t 仅包含小写字母解题思路数

2021-11-22 09:37:46 4595 24

原创 由浅入深 从堆到堆排序

本文中所有的代码全都是大根堆!实现语言是Java图片来源都是这位大神的,大神的文章也给了我很多启发 数据结构之堆堆排序 这个视频通俗易懂从什么是堆,什么是堆化,再到实现堆排序讲的很清晰,实现语言是C什么是堆1.堆的概念如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<=K2i+2 ,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最.

2021-11-21 11:05:17 978 22

原创 力扣周结02

跟着卡哥的刷题路线,本周的力扣周结没有迟到!本周完成了链表模块和部分哈希表模块,我这里将链表模块总结出来,因为总结的目的在于对旧知识点的回顾。哈希表最近几天才刷203. 移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[.

2021-11-15 10:09:37 305 22

原创 力扣周结01

跟着卡哥的刷题路线,为了巩固知识点,一周做一次力扣刷题总结,每道题我都会将原题写出来,写出我的解题思路,核心代码,时间复杂度和空间复杂度,如果有错误的地方也欢迎大家指正本周小节本周做完了数组模块的训练,收获满满。704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: .

2021-11-11 14:12:26 492 7

原创 尚医通Params和Data引起的错误

今天在做项目的时候碰到一个问题,虽然不难,但让我意识到了基础真的很重要,十一月份该行动起来了恶补基础了在做尚医通的医院设置管理模块时候,在前后端分离这一步时,后端接口在swagger测试正常,但是在前后端分离的时候后台仍然报错,请求体找不到// 条件查询带分页// @RequestBody(required = false) 防止出现 Required request body is missing的错误@ApiOperation("条件查询带分页")@PostMapping("f.

2021-10-24 16:35:48 307 4

原创 数据库四种隔离级别

数据库四种隔离级别事务的特性原子性(Atomicity):原子性是指一个事务中的操作,要么全部成功,要么全部失败,如果失败,就回滚到事务开始前的状态。一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。那转账举栗子,A账户和B账户之间相互转账,无论如何操作,A、B账户的总金额都必须是不变的。隔离性(Isolation):隔离性是当多个用户 并发的 访问数据库时,如果操作同一张表,数据库则为每一个

2021-10-20 14:29:59 382

原创 Java向上转型和向下转型

多态性“对于面向对象的程序设计语言,多态性是第三种最基本的特征(前两种是数据抽象和继承。” “多态性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与 “怎样做”两个模块的分离。利用多形性的概念,代码的组织以及可读性均能获得改善。此外,还能创建 “易于扩展”的程序。无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成 长”。 通过合并各种特征与行为,封装技术可创建出新的数据类型。通过对具体实施细节的隐藏,可将接口与实施 细节分离,使所有细

2021-10-17 08:46:03 121 1

原创 狂神Redis学习笔记

NosqlNosql = Not Only SQL泛指非关系型数据库的,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0是滴啊,尤其是超大规模的高并发的社区,暴露出很多难以克服的问题,Nosql在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是当下必须要掌握的一门技术!很多数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式。Nosql不仅仅是数据没有固定的查询语言键值对存储,列存储,文档存储,图形数据库(社交关系)最终一

2021-10-15 12:35:12 503

原创 @PathVariable和@RequestParam的区别

@PathVariable和@RequestParam的区别参考博客@PathVariable@RequestMapping(value = "/user/{username}")@ResponseBodypublic String userProfile(@PathVariable(value = "username") String username) { return "user = " + username;}在上面的例子中,当@Controller处理HTTP请求时,

2021-10-12 19:25:41 190

原创 二叉树前中后序递归和非递归遍历和层序遍历(Java实现)

二叉树的遍历定义结点@Data // lombokpublic class Node { int value; // 权 Node leftNode; // 左孩子 Node rightNode; // 右孩子 public Node(int value) { this.value = value; } public Node(int value, Node leftNode, Node rightNode) { th

2021-10-10 20:02:45 113

原创 狂神SpringCloud学习笔记

SpringCloud从入门到入土参考书:SpringCloud Netflix 中文文档:https://springcloud.cc/spring-cloud-netflix.htmlSpringCloud 中文API文档(官方文档翻译版):https://springcloud.cc/spring-cloud-dalston.htmlSpringCloud中国社区:http://springcloud.cn/SpringCloud中文网:https://springcloud.cc

2021-10-07 21:01:06 1849

原创 狂神ElasticSearch(含仿京东搜索)学习笔记

ElasticSearch从入门到实战本笔记基于【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂本笔记参考 ElasticSearch7.6入门学习笔记JDK版本:1.8以上ES,Head,Kibana,IK分词器版本:均为7.6.1在学习ElasticSearch之前,先简单了解一下Lucene:Doug Cutting开发是apache软件基金会4 jakarta项目组的一个子项目是一个开放源代码的全文检索引擎工具包不是一个完整的全文检索引擎,而是一个全

2021-10-06 10:05:03 1842 3

原创 狂神MyBatisPlus学习笔记

MyBatisPlus概述简化Mybatis MyBatisPlus官网本笔记是基于【狂神说Java】MyBatisPlus最新完整教程通俗易懂MySQL版本 5.7(5.7以下的更新一下,不然后续学习自动填充会卡壳) 添加createTime和updateTime导致导入 SQL 时出现 Invalid default value for ‘create_time’ 报错解决方法MyBatis-Plus版本 3.0.5QuickStart根据官网提供的数据导入mybatisplus数据

2021-10-05 09:26:30 462

原创 Hexo博客插入图片浏览器显示问题

Hexo博客插入图片浏览器显示问题解决办法将Hexo目录下的配置文件_config.yml里的psot_asset_folder:设置为true。在Hexo目录下执行:npm install hexo-asset-image --save执行hexo n "博客名"生成博客,此时在_post目录会生成与博客同名的文件夹。重点来了,将博客需要使用的图片移动到文件夹中,然后在博客中使用Markdown的格式引用,好多文章hexo引用本地图片的方法几乎都是:![(图片描述)(生

2021-10-03 08:10:44 381 1

转载 @Bean和@Component的区别

@Bean和@Component的区别Spring管理Bean的方式注册Bean装配BeanSpring实现管理的方式自动配置(隐式)使用JavaConfig的方式(显式)使用XML配置的方式(显式)Spring从两个角度来实现自动配置组件扫描(component):Spriing自动发现应用上下文中所创建的bean自动装配(autowired):Spring自动满足bean之间的依赖隐式装配较显示装配更为便利,但是显式装配更加强大。组件扫描和自动装配组合使用可使显式配置降

2021-10-02 10:57:02 574

原创 @ComponentScan解析

@ComponentScan解析先了解@Component要想了解@ComponentScan必须先明白@Component,组件扫描(@component):Spriing自动发现应用上下文中所创建的bean,在自动配置的方式中,使用@Component告诉Spring,我是一个bean,你要来管理我,然后使用@AutoWired注解去装配Bean(所谓装配,就是管理对象直接的协作关系)。其优点是:使用范围比较广,所有类都可以进行注解。@Component的作用就是把普通的pojo实例化到Spring

2021-10-02 10:55:00 208

空空如也

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

TA关注的人

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