<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Steven_L_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Steven_L_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Steven_L_]]></copyright><item><title><![CDATA[java: Internal error in the mapping processor: java.lang.NullPointerException解决方案]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/118668778</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/118668778</guid><author>Steven_L_</author><pubDate>Mon, 12 Jul 2021 09:54:59 +0800</pubDate><description><![CDATA[在使用MapStruct，idea2020.3版本在build项目的时候出现错误：java: Internal error in the mapping processor: java.lang.NullPointerException
解决：
Setting --&gt;Build,Execution,Deployment --&gt;Compiler --&gt;User-local build加上参数：
-Djps.track.ap.dependencies=false




...]]></description><category></category></item><item><title><![CDATA[Text-to-SQL任务：SyntaxSQLNet论文笔记]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/108753371</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/108753371</guid><author>Steven_L_</author><pubDate>Wed, 23 Sep 2020 15:03:39 +0800</pubDate><description><![CDATA[一、基本信息
论文标题：SyntaxSQLNet: Syntax Tree Networks for Complex and Cross-DomainText-to-SQL Task
论文链接：https://arxiv.org/abs/1810.05237
二、引言
SyntaxSQLNet是第一个专门针对Spider数据集的算法，论文发布在arXiv的时间为2018年10月。这个算法在Spider任务上exact matching的准确率为19.7%，进行数据增强后准确率为27.2%。
三、问题提出
之]]></description><category></category></item><item><title><![CDATA[SSO单点登录]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107835074</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107835074</guid><author>Steven_L_</author><pubDate>Thu, 06 Aug 2020 11:27:09 +0800</pubDate><description><![CDATA[对于大型系统而言，包括大量子系统，在多系统应用群中登录一个系统，便可在其他所有系统中得到授权而无需再次登录即是单点登录，包括单点登录与单点注销两部分。
Token
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦，比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端（依赖Cookie）等等。
有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢？
&nbsp;&]]></description><category></category></item><item><title><![CDATA[【算法】解压字符串（猿辅导笔试题）]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107660617</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107660617</guid><author>Steven_L_</author><pubDate>Wed, 29 Jul 2020 12:06:16 +0800</pubDate><description><![CDATA[猿辅导APP需要下发一些宣传文本给学生，工程师们使用了一种字符压缩算法，为简单起见，假设被压缩的字符全部为大写字母序列，A,B,C,D…Z,压缩规则如下：
1.AAAB可以压缩为A3B (单字符压缩不加括号)
2.ABABA可以压缩为(AB)2A （多字符串压缩才加括号）
输入数据保证不会出现冗余括号，且表示重复的数字一定合法且大于1，即不会出现：
1.（A)2B   ------- （应为：A2B）
2.  ((AB))2C,-----(应为：（AB)2C  )
3. （A)B  ----- （应为：AB]]></description><category></category></item><item><title><![CDATA[【算法】找出个数过半的元素（投票算法）]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107565546</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107565546</guid><author>Steven_L_</author><pubDate>Fri, 24 Jul 2020 17:19:48 +0800</pubDate><description><![CDATA[要求从一个数组中找到个数超过半数的元素。

解法

将元素放入map中，value为其计数，然后检查个数过半元素。时间复杂度：O(n)、空间复杂度O(n)；
排序，然后找到中间索引位置的值，进行double check。以快排为例，时间复杂度：O(nlogn)、空间复杂度O(1)；
投票算法：从左向右遍历，初始count=0，表示没有候选cand，将下一个扫描到的元素赋值为候选并设置count=1，以后如果count!=0且元素等于候选，count++，否则count–。最后如果有候选，则可能为个数过半元.]]></description><category></category></item><item><title><![CDATA[【算法】快排优化]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107424427</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107424427</guid><author>Steven_L_</author><pubDate>Sat, 18 Jul 2020 09:55:38 +0800</pubDate><description><![CDATA[快排的平均时间复杂度为O(nlogn)，但在最坏情况下为O(n^2)，对应每次都不能有效partition的情况（即原数组已经有序）。
对快排的改进思路：

每次选取基准元素时，进行随机交换，确保基准元素的随机性
对划分的元素个数已经很少时，进行插入排序提高效率，避免对小数据集的partition
使用“三路快排”思想，即将原数组划分为：小于基准元素、等于基准元素和大于基准元素的三部分。

Java代码实现
    public void quickSort3(int[] array, int low, i]]></description><category></category></item><item><title><![CDATA[【多线程】多线程顺序打印N次“ABCD”]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107333494</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107333494</guid><author>Steven_L_</author><pubDate>Tue, 14 Jul 2020 11:07:56 +0800</pubDate><description><![CDATA[考察多线程之间的通信协作。
实现需要自己封装一个Lock，包括一个flag信息，在线程中通过改变flag进行通信与协作。
Java实现
synchronized实现方法
class Lock{
    private String flag;

    public void setFlag(String flag){
        this.flag = flag;
    }

    public String getFlag(){
        return flag;
    }

    p]]></description><category></category></item><item><title><![CDATA[【算法】删除源文件中的注释（字节跳动面试题）]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107311907</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107311907</guid><author>Steven_L_</author><pubDate>Mon, 13 Jul 2020 10:33:25 +0800</pubDate><description><![CDATA[要求删除源文件中的注释，包括单行注释“//”以及多行注释“/* */”。本题是字节跳动三面面试题。
本题解法是有限状态机。注意如果采用匹配算法，如正则会有bug，比如测试用例：

/* //aaa  */   bbb
// ccc

我们定义三个状态：普通NORMAL、单行注释SINGLE以及多行注释MULTI；并定义行为：单行注释开始标志SINGLE_START、多行注释开始标志MULTI_START、单行注释结束标志SINGLE_END、多行注释结束标志MULTI_END、无行为NONE。
每次根据字符]]></description><category></category></item><item><title><![CDATA[【算法】O(n)的topK算法（字节跳动面试题）]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107248222</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107248222</guid><author>Steven_L_</author><pubDate>Fri, 10 Jul 2020 12:35:33 +0800</pubDate><description><![CDATA[前言
字节跳动二面面试题，开始想到维护小顶堆，面试官提示优化到O(n)，考虑计数排序，但计数排序需要大量空间，本题最优解法为《算法导论》上的快速选择算法，记录一下。
topK算法常见于排行榜等场景，常规的解法有：

排序  O(nlogn)
对整个数组进行了排序，显然我们只需要前K个，后面的N-K是无意义的排序，有优化空间。
堆  O(nlogk)
建小顶堆，并保持堆中元素个数为k个，遍历一次数组，每个数组中元素与堆顶元素比较，如果大于堆顶元素，则将堆顶元素移除，加入新元素。
计数排序
要求数组的数字有一定]]></description><category></category></item><item><title><![CDATA[【操作系统】select、poll和epoll详解]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107170777</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107170777</guid><author>Steven_L_</author><pubDate>Tue, 07 Jul 2020 00:52:05 +0800</pubDate><description><![CDATA[一、I/O多路复用
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I/O多路复用通过一种机制，使得一个进程可以监视多个描述符，一旦某个描述符就绪（一般是读就绪或者写就绪），能够通知程序进行相应的读写操作，支持I/O多路复用的系统调用有 select、poll、epoll。它们本质上仍是同步I/O，因为他们都需要在读写事件就绪后负责进行读写，这个读写过程是阻塞的，而异步I/O无需自己进行读写，异步I/O会负责把数据从内核拷贝到用户空间。
&nbsp;&nbsp;&nbsp;&nbsp]]></description><category></category></item><item><title><![CDATA[【算法】字符串匹配之KMP算法]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107108748</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107108748</guid><author>Steven_L_</author><pubDate>Fri, 03 Jul 2020 16:56:55 +0800</pubDate><description><![CDATA[对于字符串匹配，暴力法是对每个位置进行逐位匹配，只要有匹配失败的，就从待匹配串的下个位置开始从头匹配，这样的时间复杂度是O（MN）。
KMP算法能解决这样效率低下匹配，其核心思想是保留已匹配的前缀和，避免重复匹配，时间复杂度是O（M+N）。

举例来说，有一个字符串"BBC ABCDAB ABCDABCDABDE"，我想知道，里面是否包含另一个字符串"ABCDABD"？


首先，字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符，进行比较。因为B与A]]></description><category></category></item><item><title><![CDATA[布隆过滤器]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/107056591</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/107056591</guid><author>Steven_L_</author><pubDate>Wed, 01 Jul 2020 10:31:41 +0800</pubDate><description><![CDATA[一、什么是布隆过滤器？
布隆过滤器（Bloom Filter）是 Bloom 于1970年提出的。可以把它看作由二进制向量（或者说位数组）和一系列随机映射函数（哈希函数）两部分组成的数据结构。
相比于我们平时常用的的 List、Map 、Set 等数据结构，它占用空间更少并且效率更高，但是缺点是其返回的结果可能产生哈希冲突，从而导致误判。理论情况下添加到集合中的元素越多，误报的可能性就越大。并且，存放在布隆过滤器的数据不容易删除。
布隆过滤器典型的特点是宁可错杀，不可放过。即被布隆过滤器检测为存在的可能事实]]></description><category></category></item><item><title><![CDATA[【算法题】滑动窗口最大值]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106978803</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106978803</guid><author>Steven_L_</author><pubDate>Sat, 27 Jun 2020 09:49:32 +0800</pubDate><description><![CDATA[给定一个数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶：
你能在线性时间复杂度内解决此题吗？
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
[1  3  -1] -3  5  3  6  7   &nbsp;   &nbsp;  3
1 .]]></description><category></category></item><item><title><![CDATA[【算法】全排列算法]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106907597</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106907597</guid><author>Steven_L_</author><pubDate>Mon, 22 Jun 2020 18:37:01 +0800</pubDate><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;算法题中常见给定任意一个组合，输出所有的排列
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如leetcode：https://leetcode-cn.com/problems/permutation-i-lcci/

无重复字符串的排列组合。编写一种方法，计算某字符串的所有排列组合，字符串每个字符均不相同。
示例1:
输入：S = “qwe”
输出：[“qwe”, “qew”, “wq]]></description><category></category></item><item><title><![CDATA[【算法题】股票买卖问题解法详解]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106864997</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106864997</guid><author>Steven_L_</author><pubDate>Fri, 19 Jun 2020 23:04:27 +0800</pubDate><description><![CDATA[本解法是股票问题的通用解法，在leetcode上对应以下题：

买卖股票的最佳时机
买卖股票的最佳时机 II
买卖股票的最佳时机 III
买卖股票的最佳时机 IV
买卖股票的最佳时机含手续费
最佳买卖股票时机含冷冻期

下面来说通用解法：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这类问题有一个状态转移图：

其中：0表示未持有股票，1表示持有股票。则对应于每一天，有持有和未持有两种情况。
如果某一天持有股票，则可能是前一天就已持有股票或前一天未持有股票]]></description><category></category></item><item><title><![CDATA[【高并发】秒杀业务场景详解]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106791935</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106791935</guid><author>Steven_L_</author><pubDate>Tue, 16 Jun 2020 17:47:18 +0800</pubDate><description><![CDATA[一、秒杀场景的特点
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;秒杀的商品具有价格低、库存有限、定时开始的特点，因此秒杀场景最大的特点就是高并发。数以千万的用户的流量集中在某个时间点上（即秒杀开始时），给后端服务器造成很大压力，如果不能进行有效削峰、限流，所有请求一次性打到某一台服务器或数据库上，必然造成服务的不可用，给用户造成不良体验。
二、整体架构设计

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在整体架构上，用户的请求首先通过一个]]></description><category></category></item><item><title><![CDATA[【JVM】Java内存区域详解]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106709740</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106709740</guid><author>Steven_L_</author><pubDate>Fri, 12 Jun 2020 10:57:07 +0800</pubDate><description><![CDATA[1、运行时数据区域

1.1 程序计数器
程序计数器是一块较小的内存空间，是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里，字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令，分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的， 在任何一个确定的时刻，一个处理器（对于多核处理器来说是一个内核）都只会执行一条线程中的指令。
因此，为了线程切换后能恢复到正确的执行位置，每条]]></description><category></category></item><item><title><![CDATA[【JVM】垃圾收集器详解]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106624465</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106624465</guid><author>Steven_L_</author><pubDate>Mon, 08 Jun 2020 17:36:27 +0800</pubDate><description><![CDATA[垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定，因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别，并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。
这里讨论HotSpot虚拟机，包含的所有收集器如图：

图中展示了7种作用于不同分代的收集器，如果两个收集器之间存在连线，就说明它们可以搭配使用。
1、Serial收集器

Serial收集器是最基本、发展历史最悠久的收集器。这个收集器是一个单线程的收集器，但它的“单]]></description><category></category></item><item><title><![CDATA[【Redis】Redis底层数据结构]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106532303</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106532303</guid><author>Steven_L_</author><pubDate>Wed, 03 Jun 2020 23:07:01 +0800</pubDate><description><![CDATA[Redis的数据类型有string、list、set、zset、hash，那么这些数据类型底层如何实现的呢？
Redis是用C语言写的，底层数据结构包括六种：动态字符串、链表、字典、跳跃表、整数集合和压缩列表。
1、动态字符串
struct sdshdr{
     //记录buf数组中已使用字节的数量
     //等于 SDS 保存字符串的长度
     int len;
     //记录 buf 数组中未使用字节的数量
     int free;
     //字节数组，用于保存字符串
     ]]></description><category></category></item><item><title><![CDATA[【RabbitMQ】RabbitMQ工作模型]]></title><link>https://blog.youkuaiyun.com/Steven_L_/article/details/106434586</link><guid>https://blog.youkuaiyun.com/Steven_L_/article/details/106434586</guid><author>Steven_L_</author><pubDate>Fri, 29 May 2020 23:18:05 +0800</pubDate><description><![CDATA[1、整体架构


Broker ：实体服务器。提供传输服务，维护从生产者到消费者的传输线路，保证消息数据能按照指定的方式传输。
Exchange：消息交换机。消息按照一定规则路由到队列Queue。
Queue：消息队列。消息的载体，每条消息都会被投送到一个或多个队列中。
Binding：绑定。将Exchange和Queue按路由规则绑定。
Routing Key ：路由关键字。Exchange根据Routing Key进行消息传递。定义绑定时指定的关键字称为Binding Key。
Vhost：虚拟主机。一]]></description><category></category></item></channel></rss>