自定义博客皮肤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 50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释: = 1/= 1/4 = 0.25提示:-100.0 < x < 100.0<= n <= -1-<= <= 题目来..

2022-03-07 12:14:53 984

转载 一文讲透如何排查Redis性能问题

Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。你也许或多或少地,也遇到过以下这些场景: 在 Redis 上执行同样的命令,为什么有时响应很快,有时却很慢? 为什么 Redis 执行 SET、DEL 命令耗时也很久? 为什么我的 Redis 突然慢了一波,之后又恢复正常了? 为什么我的 Redis 稳定运行了很久,突然从某个

2022-02-28 18:07:40 398

原创 Redis AOF日志浅析

Redis AOF 日志浅析,介绍Redis AOF日志相关的内容

2022-01-15 23:30:25 833

转载 epoll本质

从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么?网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。文章核心思想是:要让读者清晰明白

2022-01-10 18:48:38 119

转载 IO多路复用

如果直接抛出多路复用的概念,或许会一脸懵逼,这次,我们以最简单 socket 网络模型,然后带着「如何服务更多的用户」的思考,一步一步的过度到 I/O 多路复用,到后面你就会突然弄懂了这个概念!最基本的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“

2022-01-09 22:42:34 89

原创 滑动窗口最大值

滑动窗口算法详解

2022-01-06 11:23:33 4725

原创 数据流中的第 K 大元素

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。请实现 KthLargest类:KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。如下:输入:["KthLargest", "add", "add", "add", "add", "add"][[3, [4, 5, 8.

2022-01-03 21:48:57 678

原创 堆排序详解

上一篇博文大概讲述了优先级队列的实现,这一篇来谈一下堆和堆排序,优先级队列参考如下博文。详解二叉堆,及优先级队列实现​​​​​​上述博文中介绍了完全二叉树,满二叉树,堆及堆的存储,以及介绍了优先级队列的一些实现,这一篇博文来介绍下堆排序相关的内容。 上文中提供了一些常用的方法,如插入一个元素时,为了维持堆的特性需要执行上浮(swim)方法,以及删除一个元素时为了维持堆的性质而执行的下沉(sink)方法。以及一些如求左孩子left方法,和求右孩子right......

2021-10-29 13:38:05 181

原创 二叉查找树

二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。它是怎么做到这些的呢?这些都依赖于二叉查找树的特殊结构。二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。...

2021-10-25 18:01:53 7370

原创 跳表(skip list)

前面博文(链表相关的)有提过,链表查询一个元素的时间复杂度是O(n)。数组根据下标查找的时间复杂度是O(1),前面的文章也提到过二分查找算法对于元素查找的改变,但是二分查找算法的底层其实是依赖于数组的随机访问特性,分配内存时,对于数组,是需要连续的空间,有时候给数组分配内存时可能会引发频繁的GC。那既然二分查找算法查找性能那么高,但是底层使用数组对内存的要求很高,那可否使用链表来代替元素的存储,即如果元素底层是基于链表存储时能不能有相应效率的“二分查找算法”?其实我们可以稍微对链表进行改造,就可以支持类

2021-10-22 14:51:22 232

原创 详解二叉堆,及优先级队列实现

首先介绍下满二叉树和完全二叉树一、满二叉树,非叶子节点的度为2(有两个子节点),叶子节点全部处于同一层上满二叉树满二叉树除了满足普通二叉树的性质,还具有以下性质:1、满二叉树中第 i 层的节点数为 个。2、深度为 k 的满二叉树必有 个节点 ,叶子数为 。3、满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶...

2021-10-09 18:07:32 334

原创 Leetcode打家劫舍系列问题

Leetcode198你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1...

2021-09-28 20:01:24 334

原创 单调栈的简单应用

栈是一种先进后出的数据结构,只能在栈顶进行元素的入栈和出栈,

2021-09-23 23:11:45 378

原创 8皇后问题

8皇后问题的描述见百度百科,这里大概描述下,在如下这种 8 *8的网格里面放入8个皇后,使得放入的这些皇后之间不能相互攻击,即任意两个皇后之间不能处于同一行,不能处于同一列,不能处于同一对角上​​​​​​​如上图所示,在图中的位置放置一个皇后之后,阴影部分都不能再放置皇后了,非阴影位置可以继续放置皇后。题目就大概是这个意思。下面采用两种方法来进行解释【方法一】利用位运算的特性来进行说明,位运算可以参考博文初识位运算从题目中我们知道,任意两个皇后之间是不能处于同一行和同一列的,那 8 *...

2021-09-17 20:03:57 171

原创 初识位运算

初识计算机时就听说过一句话,计算机只认识0和,在现代计算机中所有的数据在内存中都是以二进制存在的。位运算直接对位进行操作,如果使用得好,很多时候能够取得很好的效果,下面简要的计算几种常见的位运算及其位运算相关的题。1、与(&)运算符只有当两位都是 1 时结果才是 1,否则为 02、或(|)运算符只有当两位都是 0时结果才为 0,否则为 13、异或(^)运算符当两位相同时,则结果为 0,两位不同时结果为 14、取反(~)运算符位的值为 0则变为 1 ,...

2021-09-08 20:24:22 1709

原创 Leetcode相同的树

给两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如下面的两颗二叉树:结构相同,而且对应节点的值是相同的如下面的二叉树,结构不同,所以不能算为是相同的二叉树再比如下面的二叉树,虽然结构相等,但是值不相等,也不能算为相同的二叉树详细题解一、基于递归的解决方法递归函数public boolean isSameTree(TreeNode p, TreeNode q) {}终...

2021-09-02 10:57:02 168

原创 如何找到字符串中的最长回文子串?

什么是回文串?回文串其实就是正读和反读一样的字符串,那我们如何判断一个字符串是回文串?其实实现逻辑也比较简单,我们只需要使用双指针,一个从前往后遍历,一个从后往前遍历,关注遇到的字符是否相等即可。代码如下:private static boolean isPalindromeString(String s) { if (s == null || s.length() == 0) { return true; } in.

2021-08-10 19:18:02 3683

原创 接雨水问题

给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。注:题目描述来源于leetcode题目解析:一个桶能装多少水是由最短的那块板决定的。如下所示那对于上面由n个柱子组成的序列,能装多少水也是同样的道理,找出每...

2021-08-03 16:44:58 215

原创 浅析哈夫曼树和哈夫曼编码

在浅析哈夫曼树之前,先来了解几个关于树的概念1、什么是路劲在树或者图中,从一个点到另一个点所经过的点被称为这两个点之间的路劲。上图中,从跟节点到叶子节点C的路劲就是A B C。2、什么是路劲的长度表示的树或者是图中从一个点到另一个点所经过的边的数量。如下图,从A - > C的路劲就是23、什么是 结点的带权路径长度?将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。如下图。..

2021-07-16 20:27:11 1477 1

原创 浅析Java中的资源关闭

内存是计算机很宝贵的资源,我们在使用资源时如果不关闭打开的资源,就有可能导致内存泄露的风险,下面浅析下Java中几种常见的资源关闭方案先定义一个资源类表示需要关闭的资源public class MyResource implements Closeable { @Override public void close() throws IOException { System.out.println("MyResource的close方法被调用!"); }}

2021-04-16 14:18:30 2098 4

原创 Java代理初探

在日常的开发中,需求的变动是很正常的,而且也是经常发生的,比如在我们的开发中有如下一个接口public interface UserService { User query(User user); void save(User user);}有如下的实现类,最开始的实现是这样的。public class UserServiceImpl implements UserService { @Override public User query(User user

2021-04-02 19:34:00 144

原创 简单工厂模式 和 工厂方法模式

我们来看下面一种场景,在我们日常的开发中,会涉及到很多的配置文件,配置文件的存储、加载和使用往往都很重要。下面我们来看一种场景,我们的配置文件的后缀是(json、xml、yaml、redis和properties等)来表示配置文件的存储形式。我们针对不同的存储形式采用不同的方式加载、解析配置文件,然后装载到内存中的RuleConfig对象。/** * 配置对象 */public class RuleConfig {}我们一般的做法是像下面这样的public class RuleCon

2021-03-30 17:32:40 259

原创 线性排序算法-计数排序

我们前面分析过几种排序算法,时间复杂度为O()如冒泡排序,插入排序和选择排序等,时间复杂度为O(nlogn),如归并排序和快速排序等,接下来我们来分析一种时间复杂度为O(n)的排序算法。既然存在排序时间复杂度为O(n)的算法,为什么我们还要去分析时间复杂度更高的算法?我们知道每一种排序算法其实都有其限制条件和适用场景。其实计数排序虽然时间复杂度为O(n),但是这种算法有其先决条件,接下来我们来分析下当要排序的 n 个数据,所处的范围并不大的时候,比如最大值是 k,我们就可以把数据划分成 k 个桶。每个桶

2021-03-15 23:29:32 447

原创 快速排序

上面这边文章我们讲过归并排序的时间复杂度是O(nlogn),但是需要的空间复杂度是O(N),合并时需要额外的辅助空间,其实还有一种算法,大多数情况下时间复杂度也是O(nlogn),而且是原地排序算法,不需要偶外的空间协助。快速排序。其实快速排序也是使用的分治的思想,快速排序的原理比较简单,随机挑选一个元素(一般是挑选第一个),把小于基准元素(选择的元素)的值放置到左边,把大于基准元素的值放置到选择的元素的右边。最后再分别针对左半部分和右半部分进行相同的操作。...

2021-03-11 23:12:42 434

原创 归并排序

上一篇博文我初步讲解了插入排序,冒泡排序和选择排序。这几种排序算法的时间复杂度都是O()。时间复杂度比较高,比较适合小规模的数据排序。介绍一种时间复杂度是O(nlogn)的算法。归并排序。其实归并排序采用的是分治思想,对于数据量比较大时,可以先把问题分为小问题,最终再把小问题的解合并为大问题的解。而且归并排序在解决大数据量时比较使用,读者可参考博文大数据中的归并排序。...

2021-03-10 23:22:43 181

原创 插入排序、选择排序和冒泡排序详解

排序对于任何一个程序员来说可能都不陌生,在我们日常的开发中多多少少都会涉及到排序的场景,如按照订单交易时间排序,按照金额排序等等。很多语言都内置了相应的排序函数,而且讲起排序算法时都可以列出一大堆,此文初步探索下插入排序,选择排序和冒泡排序。此处先说明下排序算法的稳定性:稳定性,这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变,如下待排序的序列。图中框住的两个元素2,排序后相对位置不变,前面的2还是在前面,后面的2还是相对在后面。其实你也许有疑问.

2021-03-10 12:24:33 1316

原创 两个链表的第一个公共节点Java

输入两个链表,找出它们的第一个公共节点。链表的定义,哨兵节点等的处理见博文注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。如下面的两个链表:我们知道链表是通过next引用串联起来的,两个链表第一个公共节点后面的节点都是相同的,所以差异就是第一个相同节点的前面节点。我们接下来看看如何解决这个问题。思路一:可以想象成两个人走路,如下图所示,如果两个人走路.

2021-03-01 19:30:23 282

原创 链表浅析及常用题目详解(链表反转,删除和环形链表等)

链表是物理存储单元上非连续的、非顺序的存储结构,它是由一个个结点,通过指针来联系起来的,其中每个结点包括数据和指针,如下图中单链表的表示。文中统一使用以下单链表的定义:public class Node { //节点next引用 public Node next; //节点的数值域 public int val; public Node() { } public Node(int val) { this.val .

2021-02-28 23:11:42 198

原创 Java单例模式详解

单例模式可以说是设计模式中最简单和最基础的一种设计模式了,但是想写对单例模式真的很难,下面看下单例模式的几种写法及其存在的问题分析。饿汉式饿汉式是最常见也是最不需要考虑太多的单例模式,因为本就是线程安全的,饿汉式也就是在类被加载的时候就创建实例对象,饿汉式的代码如下:public class Singleton { private static Singleton singleton = new Singleton(); /** * 私有构造函数 */

2021-02-20 20:49:18 192

原创 LeetCode合并二叉树

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例1:输入:原始二叉树如下图 输出:合并后的二叉树如下图 解题思路:基于递归的解决思路...

2021-02-10 10:31:14 216

原创 Leetcode从根到叶的二进制数之和

题目描述给出一棵二叉树,其上每个结点的值都是0或1。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数01101,也就是13。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。返回这些数字之和。题目数据保证答案是一个 32 位 整数。示例 1:输入:root = [1,0,1,0,1,0,1]输出:22解释:(100) + (101) + (110)...

2021-02-07 20:02:31 130

原创 Java switch支持类型详解

switch支持哪些类型?(1)最早时,只支持int、char、byte、short这样的整型的基本类型或对应的包装类型Integer、Character、Byte、Short常量,包装类型最终也会经过拆箱为基本类型,本质上还是只支持基本类型(2)JDK1.5开始支持enum,原理是给枚举值进行了内部的编号,进行编号和枚举值的映射(3)1.7开始支持String,但不允许为null,原理是借助 hashcode( ) 来实现。我们首先看下Jdk的官方文档。官方文档中对于switch有如下描述。

2021-01-27 19:49:04 4301 1

原创 Java switch及tableswitch、lookupswitch介绍

在Java中switch的形式:switch(key){ case num1: //可以加入自己的业务逻辑 break; case num2: //可以加入自己的业务逻辑 break; default: //可以加入自己的业务逻辑 break;}上述代码中switch(key)中的key可以是什么类型?(1)最早时,只支持int、char、byte、short这样的整型

2021-01-26 23:36:28 1310 1

原创 填充每个节点的下一个右侧节点指针

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:public class Node { public int val; public Node left; public Node right; public Node next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:...

2021-01-25 20:25:49 122

原创 Leetcode对称二叉树

题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。但是下面这个[1,2,2,null,3,null,3]则不是镜像对称的:假设二叉树的节点定义如下所示:public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode() { } pub...

2021-01-19 21:08:36 328

原创 二叉树遍历详解

二叉树的遍历方式是最基本,也是最重要的一类题目,我们将从「前序」、「中序」、「后序」、「层序」四种遍历方式出发,总结他们的递归和迭代解法。一、二叉树定义 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。简单来说,就是一个包含节点,以及它的左右孩子的一种数据结构假设二叉树的节...

2021-01-16 13:29:51 5110

原创 Leetcode-每日温度Java

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。解法一、暴力破解对于每一个温度,向后进...

2021-01-07 20:21:55 328

原创 ByteBuf 内部结构设计

一、首先介绍下 ReferenceCounted 接口public interface ReferenceCounted { /** * 返回对象的引用数量,如果返回0,表示这个对象已经被释放 */ int refCnt(); /** * 引用计数加 1 */ ReferenceCounted retain(); /** * 引用计数加 increment */ ReferenceCount

2020-12-09 23:53:05 197

原创 Class.forName和ClassLoader

Java类加载过程装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间; 解析:将常量池中的符号引用转成直接...

2020-12-09 12:16:40 262

转载 JDK源码阅读-Reference

Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象。如果只提供强引用,我们就很难写出“这个对象不是很重要,如果内存不足GC回收掉也是可以的”这种语义的代码。Java在1.2版本中完善了引用体系,提供了4中引用类型:强引用,软引用,弱引用,虚引用。使用这些引用类型,我们不但可以控制垃圾回收器对对象的回收策略,同时还能在对象被回收后得到通知,进行相应的后续操作。引用与可达性分类Java目前有4中引用类型:

2020-12-08 22:36:27 141

空空如也

空空如也

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

TA关注的人

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