自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java: Internal error in the mapping processor: java.lang.NullPointerException解决方案

在使用MapStruct,idea2020.3版本在build项目的时候出现错误:java: Internal error in the mapping processor: java.lang.NullPointerException解决:Setting -->Build,Execution,Deployment -->Compiler -->User-local build加上参数:-Djps.track.ap.dependencies=false...

2021-07-12 09:54:59 1564

转载 Text-to-SQL任务:SyntaxSQLNet论文笔记

一、基本信息论文标题: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%。三、问题提出之

2020-09-23 15:03:39 618

原创 SSO单点登录

对于大型系统而言,包括大量子系统,在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录即是单点登录,包括单点登录与单点注销两部分。Token       我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢? &

2020-08-06 11:27:09 836 1

原创 【算法】解压字符串(猿辅导笔试题)

猿辅导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

2020-07-29 12:06:16 1084

原创 【算法】找出个数过半的元素(投票算法)

要求从一个数组中找到个数超过半数的元素。解法将元素放入map中,value为其计数,然后检查个数过半元素。时间复杂度:O(n)、空间复杂度O(n);排序,然后找到中间索引位置的值,进行double check。以快排为例,时间复杂度:O(nlogn)、空间复杂度O(1);投票算法:从左向右遍历,初始count=0,表示没有候选cand,将下一个扫描到的元素赋值为候选并设置count=1,以后如果count!=0且元素等于候选,count++,否则count–。最后如果有候选,则可能为个数过半元.

2020-07-24 17:19:48 832

原创 【算法】快排优化

快排的平均时间复杂度为O(nlogn),但在最坏情况下为O(n^2),对应每次都不能有效partition的情况(即原数组已经有序)。对快排的改进思路:每次选取基准元素时,进行随机交换,确保基准元素的随机性对划分的元素个数已经很少时,进行插入排序提高效率,避免对小数据集的partition使用“三路快排”思想,即将原数组划分为:小于基准元素、等于基准元素和大于基准元素的三部分。Java代码实现 public void quickSort3(int[] array, int low, i

2020-07-18 09:55:38 599

原创 【多线程】多线程顺序打印N次“ABCD”

考察多线程之间的通信协作。实现需要自己封装一个Lock,包括一个flag信息,在线程中通过改变flag进行通信与协作。Java实现synchronized实现方法class Lock{ private String flag; public void setFlag(String flag){ this.flag = flag; } public String getFlag(){ return flag; } p

2020-07-14 11:07:56 684

原创 【算法】删除源文件中的注释(字节跳动面试题)

要求删除源文件中的注释,包括单行注释“//”以及多行注释“/* */”。本题是字节跳动三面面试题。本题解法是有限状态机。注意如果采用匹配算法,如正则会有bug,比如测试用例:/* //aaa */ bbb// ccc我们定义三个状态:普通NORMAL、单行注释SINGLE以及多行注释MULTI;并定义行为:单行注释开始标志SINGLE_START、多行注释开始标志MULTI_START、单行注释结束标志SINGLE_END、多行注释结束标志MULTI_END、无行为NONE。每次根据字符

2020-07-13 10:33:25 2092 3

原创 【算法】O(n)的topK算法(字节跳动面试题)

前言字节跳动二面面试题,开始想到维护小顶堆,面试官提示优化到O(n),考虑计数排序,但计数排序需要大量空间,本题最优解法为《算法导论》上的快速选择算法,记录一下。topK算法常见于排行榜等场景,常规的解法有:排序 O(nlogn)对整个数组进行了排序,显然我们只需要前K个,后面的N-K是无意义的排序,有优化空间。堆 O(nlogk)建小顶堆,并保持堆中元素个数为k个,遍历一次数组,每个数组中元素与堆顶元素比较,如果大于堆顶元素,则将堆顶元素移除,加入新元素。计数排序要求数组的数字有一定

2020-07-10 12:35:33 1384 1

原创 【操作系统】select、poll和epoll详解

一、I/O多路复用      I/O多路复用通过一种机制,使得一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作,支持I/O多路复用的系统调用有 select、poll、epoll。它们本质上仍是同步I/O,因为他们都需要在读写事件就绪后负责进行读写,这个读写过程是阻塞的,而异步I/O无需自己进行读写,异步I/O会负责把数据从内核拷贝到用户空间。   &nbsp

2020-07-07 00:52:05 1813

原创 【算法】字符串匹配之KMP算法

对于字符串匹配,暴力法是对每个位置进行逐位匹配,只要有匹配失败的,就从待匹配串的下个位置开始从头匹配,这样的时间复杂度是O(MN)。KMP算法能解决这样效率低下匹配,其核心思想是保留已匹配的前缀和,避免重复匹配,时间复杂度是O(M+N)。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A

2020-07-03 16:56:55 2492

原创 布隆过滤器

一、什么是布隆过滤器?布隆过滤器(Bloom Filter)是 Bloom 于1970年提出的。可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果可能产生哈希冲突,从而导致误判。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。布隆过滤器典型的特点是宁可错杀,不可放过。即被布隆过滤器检测为存在的可能事实

2020-07-01 10:31:41 1159

原创 【算法题】滑动窗口最大值

给定一个数组 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     31 .

2020-06-27 09:49:32 1087

原创 【算法】全排列算法

       算法题中常见给定任意一个组合,输出所有的排列       如leetcode:https://leetcode-cn.com/problems/permutation-i-lcci/无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1:输入:S = “qwe”输出:[“qwe”, “qew”, “wq

2020-06-22 18:37:01 1083

原创 【算法题】股票买卖问题解法详解

本解法是股票问题的通用解法,在leetcode上对应以下题:买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 IV买卖股票的最佳时机含手续费最佳买卖股票时机含冷冻期下面来说通用解法:        这类问题有一个状态转移图:其中:0表示未持有股票,1表示持有股票。则对应于每一天,有持有和未持有两种情况。如果某一天持有股票,则可能是前一天就已持有股票或前一天未持有股票

2020-06-19 23:04:27 2229 1

原创 【高并发】秒杀业务场景详解

一、秒杀场景的特点       秒杀的商品具有价格低、库存有限、定时开始的特点,因此秒杀场景最大的特点就是高并发。数以千万的用户的流量集中在某个时间点上(即秒杀开始时),给后端服务器造成很大压力,如果不能进行有效削峰、限流,所有请求一次性打到某一台服务器或数据库上,必然造成服务的不可用,给用户造成不良体验。二、整体架构设计       在整体架构上,用户的请求首先通过一个

2020-06-16 17:47:18 5768 1

原创 【JVM】Java内存区域详解

1、运行时数据区域1.1 程序计数器程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的, 在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条

2020-06-12 10:57:07 1538

原创 【JVM】垃圾收集器详解

垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。这里讨论HotSpot虚拟机,包含的所有收集器如图:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。1、Serial收集器Serial收集器是最基本、发展历史最悠久的收集器。这个收集器是一个单线程的收集器,但它的“单

2020-06-08 17:36:27 1546

原创 【Redis】Redis底层数据结构

Redis的数据类型有string、list、set、zset、hash,那么这些数据类型底层如何实现的呢?Redis是用C语言写的,底层数据结构包括六种:动态字符串、链表、字典、跳跃表、整数集合和压缩列表。1、动态字符串struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量 int free; //字节数组,用于保存字符串

2020-06-03 23:07:01 765

原创 【RabbitMQ】RabbitMQ工作模型

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

2020-05-29 23:18:05 836

原创 【JVM】Class字节码文件结构

类文件结构包含如下几个部分:魔数:固定值,确定文件是否是JVM接受的class文件版本号:class文件的版本,保证编译正常执行常量池:存放字面量和符号引用访问标志:类或接口的访问信息,包括是类还是接口、public还是private、是否abstract、final等当前类索引、父类索引:类索引用于确定类的全限定名,Java是单继承,父类索引只有一个,如果没有继承,默认继承java.lang.Object接口索引集合:描述这个类实现了哪些接口,按从左到右顺序加入接口集合中字段表集合:描述.

2020-05-22 20:38:03 705

原创 【JVM】类的加载过程

类的加载过程分为加载、连接、初始化,而连接过程又分为验证、准备、解析。加载在加载过程,完成3件事情:1) 通过全类名获取定义此类的二进制字节流;2) 将字节流代表的静态存储结构转换为方法区的运行时数据结构;3) 在内存中生成代表该类的class对象,作为方法区这些数据的访问入口。非数组类的加载还可以通过自定义类加载器去控制字节流的获取方式(重写一个类加载器的loadClass()方法),数组类型不通过类加载器创建,而是JVM直接创建。验证包括验证class文件的魔数、版本号、符号引用合法性、是否

2020-05-20 21:28:52 1104

原创 【JVM】一个Java对象的创建过程

Object obj = new Object();Java中创建对象时,需要经过5个阶段,分别是:类加载检查、分配内存、初始化零值、设置对象头、执行init方法。1、类加载检查当JVM执行到一条new指令时,先检查这条指令的参数是否能在常量池定位到这个类的符号引用,同时检查这个类是否已被加载、解析、初始化,如果没有则会先进行类加载过程。2、分配内存在类加载检查后,JVM为新对象分配内存。对象所需的内存大小在类加载完成后可确定,因此分配内存的过程就是把一块确定大小的内存从堆中划分出来。分配方式有指

2020-05-18 21:49:00 3351

原创 【算法归纳】二叉树遍历的非递归算法

二叉树遍历的常规算法是递归,通过一个栈可实现非递归算法,许多关于树的算法题都是这些非递归算法的变形,需要熟练掌握。特别注意后序遍历的特殊性,在回溯时需要判断右子树是否已经访问过。1、前序遍历public void pre(TreeNode node) { Stack<TreeNode> stack = new Stack<>(); TreeNode cur = node; while(cur!=null || !stack.isEmpty()) {

2020-05-17 15:49:15 1268

原创 【Java集合】探究HashSet的底层实现 加入相同元素是否会覆盖?

HashSet是一个常见的集合类,底层使用HashMap实现。那么HashSet如何保证元素不重复呢?如果多次放入equals()为true的相同元素会覆盖吗?今天来探究一下源码首先,来看看HashSet的无参构造函数 /** * Constructs a new, empty set; the backing {@code HashMap} instance has * default initial capacity (16) and load factor (0.75).

2020-05-14 16:34:52 5160 1

原创 【算法题】左旋转字符串

题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!分析循环左移可以视作3次字符串反转,分别是分界线两侧分别反转和全字符串的反转。如例子中,依次反转abc、XYZdef、整个字符串,即可得到XYZdefabc。代码public class Solut

2020-05-12 22:56:06 877

原创 【算法题】链表中环的入口结点

题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。分析要判断链表是否有环直接用快慢指针即可,但如何找到入口结点呢?画个草图分析一下:快慢指针在红色标记处相遇,则有如下等式成立:2(A+B)=A+2B+C得到:A=C那么此时用另一个指针从头结点开始,每次移动一步。最终,它们会在入口结点相遇。代码public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) {

2020-05-11 00:34:29 646

原创 【操作系统】实现生产者消费者模型

最近在复习操作系统,顺便写两种Java实现生产者消费者模型的方式一、信号量import java.util.Queue;import java.util.Random;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.Semaphore;class MessageQueue { private static final Semaphore FULL = new Semaphore

2020-05-10 11:24:20 2052

原创 【操作系统】进程间通信的6种方式

一、管道UNIX 系统IPC最古老的形式。特点:只支持半双工通信(单向交替传输)只能在父子进程或兄弟进程之间通信只存在于内存中,不属于任何文件系统二、命名管道(FIFO)常用于C/S应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据,它是一种文件类型。特点:不再局限于父子进程和兄弟进程之间的通信,可以在任意进程之间通信有路径名与之关联,以一种特殊设备文件形式存在文件系统三、消息队列消息队列,是消息的链表,存放在内核中。一个消息队列由一个标识符(即队列ID

2020-05-10 10:26:30 6570

原创 【算法题】和为S的连续正数序列

题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!输出描述输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序分析滑动窗口法,初始化low=1、high=2

2020-05-09 23:54:26 1218

原创 【算法题】设计LRU缓存

题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶你是否可以在

2020-05-09 19:59:10 6573 3

原创 【算法题】两个链表的第一个公共结点

题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)分析先遍历一次两个链表,找到较长的,让该链表指针先走delta步,较短链表从头开始走,最终两指针必然会在第一个公共结点相遇。代码public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { int len1=g

2020-05-09 00:29:35 2148

原创 【算法题】丑数

题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析丑数可以分解成2a+3b+5c的形式,则可通过改变2、3、5的系数,依次找到下一个丑数。代码public class Solution { public int GetUglyNumber_Solution(int index) { if(index<7) return ind

2020-05-09 00:02:23 921

原创 【算法题】数组中只出现一次的数字

题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析要解这题需要对异或操作有比较深的理解。依次将数组中所有元素进行异或得到a,即num1和num2的异或。然后取a中二进制为1的一个位置,找到原数组中所有该位为1的数字进行异或,得到了num1,接下来再将num1与a异或,得到num2。代码//num1,num2分别为长度为1的数组。...

2020-05-06 12:13:55 2692

原创 【算法题】二叉树的下一个结点

题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度O(n)。根据几种情况下的分析,时间复杂度可优化到O(L),L为该结点与后继结点在树中的实际距离。1)如果该结点有右孩子,则找到右孩子的最左叶子结点返回;2)...

2020-05-06 08:43:35 2155

原创 【算法题】对称的二叉树

题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析本题比较简单,思想是镜像比较,即左孩子结点与右孩子结点比较,右孩子结点与左孩子结点比较,直到遍历全部二叉树匹配,则返回true,否则返回false。将通过三种二叉树的遍历方式进行求解。代码1(递归)public class Solution { boole...

2020-05-05 23:17:28 1347

原创 【算法题】序列化二叉树

题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得...

2020-05-05 20:35:42 1564

原创 【算法题】数据流中的中位数

题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。分析用一个大顶堆、一个小顶堆实现,其中大顶堆保存的是较小的元素,则堆顶是这些元素中的最大值;小顶堆保...

2020-05-05 19:00:42 2320

原创 【算法题】矩阵中的路径

题目描述分析利用回溯法,从矩阵任一点开始,向四周试探,若满足字符顺序,则走一步并继续试探,直到字符串搜索结束返回true。如果都不满足,则回溯继续搜索。由于不能重复走同一个格子,需要一个额外的布尔数组记录走过的路径,同时,在回溯时要将走过的当前格子标记清除。代码(已AC)public class Solution { public boolean hasPath(char[] m...

2020-05-04 17:13:51 2901

原创 【算法题】机器人的运动范围

题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8= 19。请问该机器人能够达到多少个格子?分析典型的DFS题。初始化一个布尔型二...

2020-05-04 16:47:30 3155 1

空空如也

空空如也

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

TA关注的人

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