自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode 无重复字符的最长子串(3题)

LeetCode 无重复字符的最长子串@author:Jingdai@date:2022.01.17题目描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例输入s = "abcabcbb"示例输出3 解释因为无重复字符的最长子串是 "abc",所以其长度为 3。思路及代码我们可以从头到尾遍历每个字符,记录以每个字符结尾的不含重复字符的长度,然后从中选出最长的就是结果。那现在问题就变成了怎么求出以每个字符结尾的不含重复字符的长度。方法1:基于滑动窗

2022-01-17 13:05:44 354

原创 百度笔试(2021-9-7)子序列问题

算法 百度笔试(2021-9-7)子序列问题@author:Jingdai@date:2021.09.18前几天做百度笔试的一个题没有a出来,今天有空,搜了大佬的题解,做了出来,现在总结一下。题目描述给你一个长度为 n 且全部由小写字母组成的字符串 s,问你有多少个子序列恰好包含 k 个字母?输入描述,第一行两个整数 n 和 k,第二行输入一个长度为 n 的仅含小写字母的字符串 s。输出描述,恰好包含k个字母的子序列的个数,由于个数可能会很大,所以输出对 1000000007 取余的结果。

2021-09-18 22:48:24 1126 1

原创 LeetCode 课程表 III(630题)

LeetCode 课程表 III@author:Jingdai@date:2021.09.17题目描述这里有 n 门不同的在线课程,他们按从 1 到 n 编号。每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天。一门课要持续学习 t 天直到第 d 天时要完成,你将会从第 1 天开始。给出 n 个在线课程用 (t, d) 对表示。你的任务是找出最多可以修几门课。示例输入[[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]

2021-09-17 17:38:59 358

原创 LeetCode 零钱兑换 II(518题)完全背包转换

LeetCode 零钱兑换 II@author:Jingdai@date:2021.09.12题目描述(518题)给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。示例输入amount = 5, coins = [1, 2, 5]示例输出4解释解释:有四种方式可以凑成总金额:5

2021-09-12 15:43:58 198

原创 ThreadLocal源码分析总结

ThreadLocal源码分析总结@author:Jingdai@date:2021.07.25上篇分析了ThreadLocalMap的源码,这篇继续分析ThreadLocal的源码。本文将会分析ThreadLocal的源码、内存泄露问题及 ThreadLocal 和线程池结合使用的问题。简介ThreadLocal 用来创建线程局部变量,使每个线程有自己独立的变量副本,不会有线程安全问题。ThreadLocal 通常定义为private static 的属性,用以存储与线程相关联的状态(如us

2021-07-25 00:03:35 84 2

原创 ThreadLocalMap源码分析总结

ThreadLocalMap源码分析总结@author:Jingdai@date:2021.07.23网上关于ThreadLocal的介绍非常多,但是想理解ThreadLocal,ThreadLocalMap是绕不开的,这篇文章从源码的角度分析ThreadLocalMap。作者水平有限,不免有理解错误之处,欢迎讨论。同时,读这篇文章前希望有一点点ThreadLocal的理解,否则可能不太容易懂。简介ThreadLocalMap 是一个Map,不同于 HashMap,它没有实现 Map 接口,也

2021-07-23 22:01:02 156

原创 AQS源码分析总结(2)

AQS源码分析总结(2)@author:Jingdai@date:2021.07.20上一篇介绍了 acquire 和 release 方法的详细流程,这两个方法都是对同步队列进行操作的,AQS 框架中还有一个重要的队列,就是条件队列,这篇文章将介绍 AQS 的条件队列及其相关的操作。整体思路当调用 AQS 的 await 方法时,AQS 就会把当前线程加入到对应的条件队列中去等待。等其他的线程调用 signal 方法时,就会把这个线程从条件队列中移出,放入同步队列中。条件队列的设计思路和

2021-07-20 23:11:44 146 2

原创 AQS源码分析总结(1)

AQS源码分析总结(1)@author:Jingdai@date:2021.07.20最近研究了一下AQS源码,记录一下,水平有限,不免理解有错,欢迎讨论指正。整体思路AQS是一个提供了简化同步类设计的框架,利用AQS可以比较容易的实现同步和互斥等功能。AQS主要就是利用一个同步状态 state 来表示目前的同步状态,AQS负责管理这个同步状态。当线程无法得到同步资源时,需要将线程加入同步队列中,所以AQS 还负责管理一个同步队列。加入同步队列的同时,也涉及到线程的阻塞和唤醒,所以 AQS

2021-07-20 21:51:33 154 1

原创 JDK7的ConcurrentHashMap源码分析总结

JDK7的ConcurrentHashMap源码分析总结@author:Jingdai@date:2021.07.15花了一天多时间把JDK7的ConcurrentHashMap源码研究了一下,现总结如下。由于水平有限,不免有错误,欢迎大佬指正。整体思路ConcurrentHashMap名字太长,后文用CHM代替。不同于HashTable用一把锁加锁所有的桶,CHM使用分段锁,每次加锁只锁整个Map的一部分,这样就大大提高了并发量,当不同的线程想同时修改CHM的不同部分时,不会阻塞。CHM中用

2021-07-15 22:30:06 171 1

原创 select、poll和epoll总结

select、poll和epoll总结@author:Jingdai@date:2021.07.12select、poll和epoll都是操作系统实现多路复用的方式,多路复用是对线程的复用,让一个线程高效的处理多个socket,下面介绍这几种多路复用方式。select首先来看操作系统提供的函数。int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval

2021-07-12 17:05:17 127

原创 常用负载均衡算法概念及实现总结

常用负载均衡算法概念及实现总结@author:Jingdai@date:2021.07.06这篇文章将介绍常用的几个负载均衡算法,随机算法(简单随机、加权随机)、轮询算法(简单轮询、加权轮询、平滑加权轮询)、一致性hash算法。现代互联网环境下,当流量请求很大的时候,一台服务器就很难很好的完成任务了,就需要用多台服务器建立一个集群来完成任务。如图,由3个服务器组成的集群,负载均衡算法解决的问题就是如何将流量合理的打到这三台服务器上,使系统的性能达到最佳。随机算法简单随机最简单的办法就是

2021-07-06 22:41:32 317 1

原创 NIO 服务器端不阻塞的一个Bug解决

NIO 服务器端不阻塞的一个Bug解决@author:Jingdai@date:2021.06.27今天用 NIO 时出现了一个Bug,搞了半天,现在记录一下。使用 NIO 进行通信时,在客户端正常关闭时(即调用close() 方法关闭),会触发服务器的一个读事件,此时服务器的 read 方法会返回 -1,根据此我们就可以做一些处理,如下代码。int n = socketChannel.read(byteBuffer);if (n == -1) { selectionKey.canc

2021-06-27 17:27:41 130

原创 Java单例模式详解

Java单例模式详解@author:Jingdai@date:2021.06.15单例模式是23种设计模式中最简单的模式,但是在由于多线程的存在,导致还是存在一些细节问题需要注意。单线程单例顾名思义就是应用中这个类至多只有一个实例,并提供给外界一个访问到这个实例的入口。既然一个类至多一个实例,那它的构造方法就一定要是私有的,否则外界就可以随意的创建这个对象,导致不是单例。而将构造方法私有后,只有类内可以访问构造方法,所以需要一个类内的方法创建对象,并将对象返回,如此,便可写成如下代码。publi

2021-06-15 16:42:07 1153 1

原创 Java装饰器模式详解

Java装饰器模式详解@author:Jingdai@date:2021.06.03案例假设你开了一个咖啡店,目前有三种咖啡,HouseBlend、DarkRoast和Decaf,每种咖啡都有价格,可以设计一个抽象类 Beverage 作为父类,这三个咖啡去继承Beverage,代码如下。Beverage.javapublic abstract class Beverage { public abstract double cost(); // other methods}

2021-06-03 17:18:30 148 2

原创 约瑟夫环问题

算法 约瑟夫环问题@author:Jingdai@date:2021.06.02约瑟夫环问题是一个非常经典的问题,希望看完这篇文章可以让你学会解决这个问题。题目描述n 个人围成一圈,从第一个开始报数,第 m 个将被杀掉,然后从 m 后面那个人开始重新报数,直到最后剩下一个人。求最后剩下的那个人的下标。思路常规的思路可以利用链表或者数组进行模拟删除过程,但是当 n 和 m 比较大的时候,这种方法就会超时,这里记录一种递推的方法。以 n = 5,m = 3 为例,我们给每个人标记为 A、

2021-06-02 21:49:39 180

原创 Java工厂模式详解

@author:Jingdai@date:2021.05.24Java工厂模式详解工厂模式只包括两个,一个是工厂方法(Factory Method)模式,一个是抽象工厂(Abstract Factory)模式,但是我们平时也经常听到简单工厂模式和静态工厂模式,它们有什么关系呢?希望这篇文章能解决你的问题。简单工厂、静态工厂首先说明,简单工厂并不属于23种设计模式中的某一种,它更像是一种编程习语。本文中的例子部分来自于深入浅出设计模式,看下面这个例子。Pizza orderPizza(Str

2021-05-24 22:48:26 586 3

原创 JDK动态代理原理

JDK动态代理原理@author:Jingdai@date:2021.05.03接上篇,记录一些学习JDK动态代理的知识点。1.JVM生成的动态代理类都是Proxy的子类Java8 API原句:Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by t

2021-05-03 11:21:42 123 1

原创 Java静态代理和动态代理

Java静态代理和动态代理@author:Jingdai@date:2021.05.03代理模式为目标对象提供(包装)一个代理,这个代理可以控制对目标对象的访问。通过代理对象调用目标对象代理对象可以添加监控和审查处理静态代理代理类和目标对象都要实现同一个接口,同时,代理对象需要持有目标对象,外界需要调用目标对象时,直接调用代理对象。同时,代理对象在调用时可以增加一些前置处理和后置处理。下面是一个例子。接口package proxy;// interfacepublic inte

2021-05-03 11:18:22 118

原创 数据库三范式

数据库三范式@author:Jingdai@date:2021.04.24要理解数据库的三范式,必须要知道数据库的函数依赖,不了解的建议先看一下数据库函数依赖。第一范式(1NF)若关系模式R(U)R(U)R(U)中的关系的每个分量都是不可分的数据项(值、原子),则称R(U)R(U)R(U)属于第一范式,记为R(U)R(U)R(U)∈1NF。复合属性和多值属性不满足第一范式。第二范式(2NF)若关系模式R(U)R(U)R(U)∈1NF且UUU中的每一个非主属性都完全函数依赖于候选键,则

2021-04-24 15:30:10 141

原创 数据库函数依赖

数据库函数依赖@author:Jingdai@date:2021.04.24函数依赖设R(U)R(U)R(U)是属性集合U={A1,A2,..,An}U=\{A_1,A_2,..,A_n\}U={A1​,A2​,..,An​}上的一个关系模式,XXX、YYY是UUU上的两个子集,若对R(U)R(U)R(U)的任意一个可能的关系rrr,rrr中不可能有两个元组满足在XXX中属性值相等而在YYY中属性值不等,则称“XXX函数决定YYY”或者“YYY函数依赖于XXX”,记做XXX→YYY。示例:U =

2021-04-24 15:23:54 221

原创 MySQL的MVCC总结

MySQL的MVCC总结@author:Jingdai@date:2021.04.18最近学习了一下MVCC的实现,现总结一下。概念在介绍之前,先介绍几个概念,后面会用到。RC(READ COMMITTED)只能读取到其他事务提交的数据,可以解决脏读问题。RR(REPEATABLE READ)在一次事务中,读取到的数据不会改变,可以解决脏读和不可重复读的问题。快照读普通的select语句,根据MVCC机制读。当前读加了 in share mode 或 for

2021-04-18 22:13:07 145

原创 HashMap的循环链表图解

HashMap的循环链表图解@author:Jingdai@date:2021.03.20复习HashMap的知识点,总是看到jdk1.7前在多线程操作时可能会出现循环链表问题,不是很理解,于是研究源码并画图终于搞懂,记录一下。由于本人电脑只有jdk1.5和jdk1.8,所以以下分析均基于jdk1.5,jdk1.7应该一样。循环链表发生的地方循环链表发生在多个线程同时对HashMap进行put操作使HashMap 扩容的时候。下面看代码。public V put(K key, V valu

2021-03-20 15:43:57 4931 3

原创 LeetCode 根据身高重建队列(406题)

LeetCode 根据身高重建队列@author:Jingdai@date:2021.03.18题目描述(406题)假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第

2021-03-18 15:22:53 418 1

原创 LeetCode 寻找两个正序数组的中位数(4题)

LeetCode 寻找两个正序数组的中位数(4题)@author:Jingdai@date:2021.03.14题目描述(4题)给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。思路及代码如果不考虑时间复杂度,可以很容易想到两种方法,一种是先将数组合并,然后进行排序后找中位数,时间复杂度是 O((m+n)*log(m+n));另一种是根据数组顺序进行合并,合并后就是有序的数组,然后在求中位数,时间复杂度是 O(m+n

2021-03-14 21:34:44 359

原创 Java 解析Pcap文件(2)

Java 解析Pcap文件(2)@author:Jingdai@date:2021.03.11前面介绍了Pcap文件的结构并对Pcap文件的 Global Header 和 Packet Header进行了解析,接下来就是对Packet Data 即数据链路层的帧进行解析了。数据链路层解析Pcap包的Packet Data就是数据链路层的帧,可以根据前面的Packet Header 中的 capLen 字段知道对应的Packet Data 数据的字节数,从而进行读取。这里仅仅以以太网的帧为例进

2021-03-11 11:26:03 1360

原创 Java 解析Pcap文件(1)

Java 解析Pcap文件(1)@author:Jingdai@date:2021.03.11由于毕业实验是关于TLS流量分析的,所以最近学习了一下Pcap文件的解析,现记录一下。Pcap文件结构如果所示,Pcap文件由一个Global Header后面接着若干组Packet Header 和 Packet Data 组成。先看一下 Global Header 的结构,它由 24B 组成,字段按照Pcap文件的顺序列出。magic,占4B,如果它的值是0xa1b2c3d4,代表 Pc

2021-03-11 10:46:36 3289

原创 LeetCode 零钱兑换(322题)四种方法求解

LeetCode 零钱兑换@author:Jingdai@date:2021.01.10题目描述(322题)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 :输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1思路及代码看到这个题目时,我第一想到的就是用 dfs 或者

2021-01-10 23:16:30 803

原创 LeetCode 岛屿数量(200题)DFS、BFS、并查集

LeetCode 岛屿数量@author:Jingdai@date:2020.12.29题目描述(200题)给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 :输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"],

2020-12-29 20:44:49 193

原创 判断链表是否存在环并找出环入口(图解)

算法 判断链表是否存在环并找出环入口@author:Jingdai@date:2020.12.26题目描述判断给定的链表中是否存在环,如果存在环的话找出环的入口并输出,如果不存在环的话就输出 null。思路及代码首先第一个问题是如何判断一个链表中是否存在环呢?熟悉快慢指针的童靴一定知道判断链表是否存在环是一个典型的可以用快慢指针解决的问题。我们用两个指针,一个慢指针 slowPointer,一个快指针 fastPointer。他们都从头开始走, 慢指针一次走一步,快指针一次走两步,如果存在

2020-12-26 16:24:31 217

原创 LeetCode 最大交换(670题)两种方法图解

LeetCode 最大交换@author:Jingdai@date:2020.12.25题目描述(670题)给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。示例 1 :输入: 2736输出: 7236解释: 交换数字2和数字7。思路及代码方法1 排序首先看一种好理解的方法,第一步将原数字按从大到小的顺序排序,也就是如果不规定交换次数所能达到的最大值。如图,比如题目中的 2736 排序后就得到了 sortedNums = 7632。然后我们对比排序后的数

2020-12-25 22:37:24 639

原创 LeetCode LRU 缓存机制(146题)

LeetCode LRU 缓存机制(146题)@author:Jingdai@date:2020.12.11题目描述(146题)运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int val

2020-12-11 22:20:36 94

原创 HashMap的get()方法的NullPointerException

HashMap的get()方法的NullPointerException@author:Jingdai@date:2020.12.07今天写代码发现一个 bug,HashMap的 get() 方法一直报空指针异常,现记录一下。看下面代码。private HashMap<Integer, Integer> cache;private LinkedList<Integer> keyList;private int capacity;public LRUCache(i

2020-12-07 15:21:14 2981

原创 LeetCode 删除二叉搜索树中的节点(450题)递归与非递归

LeetCode 删除二叉搜索树中的节点@author:Jingdai@date:2020.12.06题目描述(450题)给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。题目分析对于一个二叉搜索树,要删除树中一个节点,分3种情况。情况1:如果要删除的节点是叶子节点,比如图中节点12,可以直接删除。情况2:如果要删除的节点只有一个子树,比如图中节点5,可以将该节点的子

2020-12-06 21:25:42 348

原创 非递归后序遍历二叉树总结(2种方法)

算法 非递归后序遍历二叉树总结(2种方法)@author:Jingdai@date:2020.12.04传送门非递归先序遍历二叉树非递归中序遍历二叉树方法1非递归用栈来辅助遍历,后序遍历是第三次遇到该节点再遍历,但是栈只能给我们提供遇到两次的判断方法,第一次是入栈时,第二次是出栈时,它们分别对应着二叉树的先序和中序遍历。所以我们需要利用一些技巧来辅助我们判断,这也是后序遍历二叉树比先序和中序稍微复杂一点的原因。看着代码进行分析。public static void postOrde

2020-12-04 17:37:41 6528

原创 非递归中序遍历二叉树总结(2种方法)

算法 非递归中序遍历二叉树总结(2种方法)@author:Jingdai@date:2020.12.03方法1先序遍历是第一次遇到该节点遍历;中序是第二次遇到该节点遍历;而后序是第三次遇到该节点遍历。非递归用栈进行遍历,第一次遇到就是压栈时,第二次是弹栈时,所以中序遍历应该弹栈的时候进行遍历。弹栈后代表弹栈节点及其左子树已经遍历完了,所以此时将弹栈节点的右子节点压栈,对其右子树进行同样的操作。代码如下。public static void inOrderTraverse(TreeNode root

2020-12-03 22:22:17 4200

原创 非递归先序遍历二叉树总结(3种方法)

算法 非递归先序遍历二叉树总结(3种方法)@author:Jingdai@date:2020.12.03递归先序遍历二叉树非常的简单,但是面试的时候面试官经常会要求我们写非递归的方法,这里总结一下。方法1先写一个最简单的方法。首先回想一下层次遍历二叉树的代码,利用一个队列完成树的遍历。如下代码。public static void levelOrderTraverse(TreeNode root) { if (root == null) return; Li

2020-12-03 11:36:57 7442 1

原创 LeetCode 组合总和 Ⅱ(40题)图解

LeetCode 组合总和 Ⅱ@author:Jingdai@date:2020.11.30题目描述(40题)给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例:输入: candidates = [2,5,2,1,2], target = 5输出: [ [1,2

2020-11-30 16:34:02 126

原创 LeetCode 正则表达式匹配(10题)dp和递归方法

LeetCode 正则表达式匹配@author:Jingdai@date:2020.11.28题目描述(10题)给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素提示:s 可能为空,且只包含从 a-z 的小写字母p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *保证每次出现字符 * 时,前面都匹配到有效的字符示例1输入: s = "aa" p = "

2020-11-28 16:26:24 105

原创 迷宫算法总结(总路径数、方法数)

算法 迷宫算法总结(总路径数)@author:Jingdai@date:2020.11.20上篇总结了一下迷宫最短路径的解法,这篇总结一下迷宫中从起点到终点总路径条数的解法。题目描述这里给出一个典型求迷宫总路径的题目,来源洛谷题目P1605。给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。输入描述:第一行N、M

2020-11-20 21:03:11 2463

原创 迷宫算法总结(最短路径)

算法 迷宫算法总结(最短路径)@author:Jingdai@date:2020.11.20迷宫问题是一个非常经典的算法问题,现总结一下。题目描述给你一个迷宫,并给你一个起点和终点,请你给出从起点到终点的最短路径,若不存在最短路径,输出 -1。迷宫中用 '#' 代表障碍,其余字符都可以走。输入描述,第一行两个数代表迷宫的大小(行数m和列数n);第二行代表起点和终点的坐标;后面的 m 行是迷宫。输入示例:10 100 1 9 8#S######.#......#..#.#.#

2020-11-20 09:51:25 9013 12

空空如也

空空如也

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

TA关注的人

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