<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[I wanna be myself, where I Belong.]]></title><description><![CDATA[Java开发工程师，持续学习Java技术栈相关技术.]]></description><link>https://blog.youkuaiyun.com/NICK_53</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; NICK_53]]></copyright><item><title><![CDATA[【剑指 Offer 40】最小的k个数]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132181731</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132181731</guid><author>NICK_53</author><pubDate>Wed, 09 Aug 2023 09:58:05 +0800</pubDate><description><![CDATA[因为是输出最小的 k 个数，索引从 0 开始，所以当基准数为 k+1 小的数时，这个基准数的左边子数组就是我们要找的 k 个数，也就是基准数索引为 k 时。例如，输入 4、5、1、6、2、7、3、8 这 8 个数字，则最小的 4 个数字是 1、2、3、4。若 k < 基准数索引 ，代表第 k+1 小的数字在 左子数组 中，则递归左子数组。若 k > 基准数索引 ，代表第 k+1 小的数字在 右子数组 中，则递归右子数组。输入：arr = [0,1,2,1], k = 1。输出：[1,2] 或者 [2,1]]]></description><category></category></item><item><title><![CDATA[【剑指 Offer 39】数组中超过一半的数字]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132181671</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132181671</guid><author>NICK_53</author><pubDate>Wed, 09 Aug 2023 09:56:38 +0800</pubDate><description><![CDATA[遍历数组，是众数 +1，不是众数 -1，为 0 就接着继续重新来。数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]使用一个 map，key 存数组中的数字，val 存出现的次数。众数和非众数投票，初始票数为 0，为 0 时假设当前数字为众数。将数组排序，出现次数超过一半的数字肯定在数组中间的那个位置。你可以假设数组是非空的，并且给定的数组总是存在多数元素。当有数字出现次数超过数组长度一半时，直接返回。]]></description><category></category></item><item><title><![CDATA[【剑指 Offer 32】从上到下打印二叉树 II]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132142572</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132142572</guid><author>NICK_53</author><pubDate>Mon, 07 Aug 2023 11:11:33 +0800</pubDate><description><![CDATA[循环拿出队列中现有的所有结点，也就是本层节点，共 queue.size() 个，采用 i–的方式循环，因为队列在不停出队，长度是变化的。拿出每一个结点加入到一个 list，即本层的索引结点，然后判断本层节点的左右结点是否存在，存在就加入到对列中，为下层的节点。从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。题目要求从上到下按层打印二叉树，也就是二叉树的广度优先搜索（BFS）将本层节点的 list 加入到结果集合，开始下层循环。头结点先入队（需要先判断头结点不为空，防止空指针）]]></description><category></category></item><item><title><![CDATA[【剑指 Offer 27】二叉树的镜像]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132077772</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132077772</guid><author>NICK_53</author><pubDate>Thu, 03 Aug 2023 10:25:27 +0800</pubDate><description><![CDATA[root 的左右结点都为空，代表这棵子树只有根结点了，不需要交换直接返回。先出栈 node，如果 node 的左右子结点哪个不为空，就入栈，然后交换 node 的左右子结点。请完成一个函数，输入一个二叉树，该函数输出它的镜像。输入：root = [4,2,7,1,3,6,9]先 new 一个辅助栈，将头结点入栈，然后开始循环。二叉树的镜像，就是交换二叉树的每个节点的左右结点。栈其实就是遍历所有节点，然后交换左右子节点。递归是自下而上交换，栈是自上而下进行交换。输出：[4,7,2,9,6,3,1]]]></description><category></category></item><item><title><![CDATA[【剑指 Offer 25】 合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132056022</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132056022</guid><author>NICK_53</author><pubDate>Wed, 02 Aug 2023 10:07:41 +0800</pubDate><description><![CDATA[输入两个递增排序的链表，合并这两个链表并使新链表中的节点仍然是递增排序的。因为 l1，l2 都是递增的，我们可以从头比较，交替的拿出每次较小的头结点。当其中一个链表被全部拿出时，另一个可以直接连接在新链表的后边。因为要存放新的顺序，可以定义一个虚拟的辅助结点。输入：1->2->4, 1->3->4。输出：1->1->2->3->4->4。最后从辅助结点的下一个开始返回即可。]]></description><category></category></item><item><title><![CDATA[【剑指 Offer 22】链表中倒数第 k 个节点]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/132036059</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/132036059</guid><author>NICK_53</author><pubDate>Tue, 01 Aug 2023 10:05:09 +0800</pubDate><description><![CDATA[可以使用快慢指针，开始快慢指针都指向 head 结点，先让快指针走 k 步，然后快慢指针一块走，当快指针为空时，慢指针指向的就是该链表中倒数第 k 个节点。题目要输出该链表中倒数第 k 个节点，第一时间想到计算链表的长度 n，然后从头开始走 n-k 步，得到的结点就是该链表中倒数第 k 个节点。例如，一个链表有 6 个节点，从头节点开始，它们的值依次是 1、2、3、4、5、6。输入一个链表，输出该链表中倒数第 k 个节点。为了符合大多数人的习惯，本题从 1 开始计数，即链表的尾节点是倒数第 1 个节点。]]></description><category></category></item><item><title><![CDATA[剑指offer-11-旋转数组的最小数字(Java)]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/131761205</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/131761205</guid><author>NICK_53</author><pubDate>Mon, 17 Jul 2023 10:41:28 +0800</pubDate><description><![CDATA[请返回旋转数组的最小元素。例如，数组  [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转，该数组的最小值为 1。注意，数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]。把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。输入：numbers = [3,4,5,1,2]输入：numbers = [2,2,2,0,1]]]></description><category></category></item><item><title><![CDATA[剑指offer-06-从尾到头打印链表]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/131652244</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/131652244</guid><author>NICK_53</author><pubDate>Tue, 11 Jul 2023 08:48:25 +0800</pubDate><description><![CDATA[想要用数组倒序存储链表，如果知道长度的话，可以利用索引很简单的存入;输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。：利用递归，走到链表的末尾，在回溯时保存结点，即实现倒序；输入：head = [1,3,2]：利用栈先进后出的特性；输出：[2,3,1]]]></description><category></category></item><item><title><![CDATA[剑指offer-03-数组中重复的数字]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/131652211</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/131652211</guid><author>NICK_53</author><pubDate>Tue, 11 Jul 2023 08:45:46 +0800</pubDate><description><![CDATA[数组中某些数字是重复的，但不知道有几个数字重复了，也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。：数组长度n中数字范围为0~n-1，可以想到 数组元素的 索引 和 值 是 一对多 的关系，每次将数字n换到索引n位置，nums[n] == n时重复；：找任意一个重复数字，那我就找第一个重复的，数组是无序的，需要排序，循环比较 i 和 i+1 个数字，相等输出nums[i];：很容易想到HashSet，不能存在相同的数，可以再添加前进行contains判断，已存在直接返回；找出数组中重复的数字。]]></description><category></category></item><item><title><![CDATA[如何在项目中自定义注解实现权限数据管理案例]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130603637</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130603637</guid><author>NICK_53</author><pubDate>Mon, 15 May 2023 08:50:35 +0800</pubDate><description><![CDATA[这里的思路很简单，就是根据权限，动态的给你的SQL后边追加过滤条件。创建一个实体类BaseEntity，里边是一个map叫做params，key就是data_scope，value就是要追加的SQL。然后让每个实体类都继承这个BaseEntity，接口参数传入实体类。利用AOP前置通知给map中放一个SQL语句，mapper中用==${params.data_scope}==追加实现功能。} }让所以的实体类继承上边的BaseEntity。]]></description><category></category></item><item><title><![CDATA[防止表单重复提交的几种方式，演示一个自定义注解方式的实现]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130594275</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130594275</guid><author>NICK_53</author><pubDate>Thu, 11 May 2023 08:55:12 +0800</pubDate><description><![CDATA[将当前请求的地址参数缓存起来，下次再来一个请求时，去判断和缓存中的请求是否完全一样，一样的话并且小于规定的时间间隔，则认为是重复提交。我们现在要使用拦截器拦截请求缓存的地址参数等信息，但是如果请求参数为JSON，拦截器拦截之后，接口就无法再一次获取了，所以先要解决这个问题。如何解决请求参数为JSON时，采用IO流读取，只能请求一次的问题？]]></description><category></category></item><item><title><![CDATA[如何解决请求参数为JSON时，采用IO流读取，只能请求一次的问题？]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130596177</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130596177</guid><author>NICK_53</author><pubDate>Wed, 10 May 2023 12:24:47 +0800</pubDate><description><![CDATA[当客户端发送一个参数为JSON的请求时，我现在想使用拦截器先将它拦截并缓存起来，但是发现拦截器拦截之后，请求就无法再一次获取到数据，如下]]></description><category></category></item><item><title><![CDATA[手把手实现项目中自定义动态数据源？]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130559693</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130559693</guid><author>NICK_53</author><pubDate>Tue, 09 May 2023 10:45:01 +0800</pubDate><description><![CDATA[使用一个小例子演示一下自定义动态数据源的步骤。]]></description><category></category></item><item><title><![CDATA[如何在项目中实现登录时的验证码校验功能？]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130553120</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130553120</guid><author>NICK_53</author><pubDate>Mon, 08 May 2023 11:20:15 +0800</pubDate><description><![CDATA[【代码】如何在项目中实现登录时的验证码校验功能？]]></description><category></category></item><item><title><![CDATA[项目结构如何改造（利用RuoYi-Vue脚手架开发一个健身房会员管理系统，改造项目结构）]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130527514</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130527514</guid><author>NICK_53</author><pubDate>Sat, 06 May 2023 16:10:56 +0800</pubDate><description><![CDATA[记录一下利用RuoYi-Vue脚手架开发一个健身房会员管理系统项目结构改造的过程，虽然不难但是没弄过很容易出问题，记录一下。]]></description><category></category></item><item><title><![CDATA[MySQL高级第十七篇：数据库主从复制原理及保证数据一致性]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130332519</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130332519</guid><author>NICK_53</author><pubDate>Mon, 24 Apr 2023 23:01:29 +0800</pubDate><description><![CDATA[在实际工作中，我们常常将Redis作为缓存与MySQL来配合使用，当有请求的时候，首先会从缓存中进行查找，如果存在就直接取出，如果不存在再访问数据库。这样就提升了读取的效率，也减少了对后端数据库的访问压力。此外，对于一般数据库应用而言，都是读多写少的，当数据库读取数据压力较大时，我们可以从成本较小的方案开始优化，可以首先考虑优化SQL和索引，其次就是缓存策略，最后才是主从架构。]]></description><category></category></item><item><title><![CDATA[MySQL高级第十六篇：数据库日志有哪些（慢查询日志、通用查询日志、错误日志和二进制日志）]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130306381</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130306381</guid><author>NICK_53</author><pubDate>Sun, 23 Apr 2023 22:35:05 +0800</pubDate><description><![CDATA[慢查询日志：记录所有执行时间超过long_query_time的所有查询，方便我们对查询进行优化。通用查询日志：记录所有连接的起始时间和终止时间，以及连接发送给数据库服务器的所有指令，对我们复原操作的实际场景、发现问题，甚至是对数据库操作的审计都有很大的帮助。错误日志：记录MySQL服务的启动、运行或停止MySQL服务时出现的问题，方便我们了解服务器的状态，从而对服务器进行维护。二进制日志：记录所有更改数据的语句，可以用于主从服务器之间的数据同步，以及服务器遇到故障时数据的无损失恢复。]]></description><category></category></item><item><title><![CDATA[MySQL高级第十五篇：MVCC多版本并发控制原理剖析]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130277095</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130277095</guid><author>NICK_53</author><pubDate>Sat, 22 Apr 2023 15:02:17 +0800</pubDate><description><![CDATA[MVCC（Multiversion Concurrency Control）多版本并发控制。就是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换句话说，就是为了查询一些正在被另一个事务更新的行，并且可以看到它们被更新之前的值，这样在做查询的时候就不用等待另一个事务释放锁。本篇介绍了MVCC在READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行快照读操作时访问记录的版本链的过程。]]></description><category></category></item><item><title><![CDATA[MySQL高级第十四篇：锁机制分类详解（表锁，行锁，页锁，悲观锁和乐观锁）]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130140662</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130140662</guid><author>NICK_53</author><pubDate>Thu, 20 Apr 2023 22:00:52 +0800</pubDate><description><![CDATA[事务的隔离性就是由锁来实现。锁是计算机协调多个进程或线程并发访问某一资源的机制。和在开发中加锁以保证数据的一致性一样，这个思想在数据库领域中同样很重要。在数据库中，数据是一种供许多用户共享的资源，为保证数据的一致性，需要对并发操作进行控制，因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。]]></description><category></category></item><item><title><![CDATA[MySQL高级第十三篇：MySQL事物日志（redo日志-undo日志执行流程）]]></title><link>https://blog.youkuaiyun.com/NICK_53/article/details/130094532</link><guid>https://blog.youkuaiyun.com/NICK_53/article/details/130094532</guid><author>NICK_53</author><pubDate>Wed, 12 Apr 2023 23:00:55 +0800</pubDate><description><![CDATA[事务有4种特性：原子性、一致性、隔离性和持久性。事务的隔离性由锁机制实现，而事务的 原子性、一致性和持久性 由事务的 redo日志 和 undo日志 来保证。REDO LOG ： 重做日志，提供再写入操作，恢复提交事务修改的页操作，用来保证事务的持久性。UNDO LOG ： 回滚日志，回滚行记录到某个特定版本，用来保证事务的原子性、一致性。REDO 和 UNDO 都可以视为是一种恢复操作，区别如下：redo log：是存储引擎层（innodb）生成的日志，记录的是物理级别。]]></description><category></category></item></channel></rss>