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-<= <= 题目来..
一文讲透如何排查Redis性能问题 Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。你也许或多或少地,也遇到过以下这些场景: 在 Redis 上执行同样的命令,为什么有时响应很快,有时却很慢? 为什么 Redis 执行 SET、DEL 命令耗时也很久? 为什么我的 Redis 突然慢了一波,之后又恢复正常了? 为什么我的 Redis 稳定运行了很久,突然从某个
epoll本质 从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么?网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。文章核心思想是:要让读者清晰明白
IO多路复用 如果直接抛出多路复用的概念,或许会一脸懵逼,这次,我们以最简单 socket 网络模型,然后带着「如何服务更多的用户」的思考,一步一步的过度到 I/O 多路复用,到后面你就会突然弄懂了这个概念!最基本的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“
数据流中的第 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.
堆排序详解 上一篇博文大概讲述了优先级队列的实现,这一篇来谈一下堆和堆排序,优先级队列参考如下博文。详解二叉堆,及优先级队列实现上述博文中介绍了完全二叉树,满二叉树,堆及堆的存储,以及介绍了优先级队列的一些实现,这一篇博文来介绍下堆排序相关的内容。 上文中提供了一些常用的方法,如插入一个元素时,为了维持堆的特性需要执行上浮(swim)方法,以及删除一个元素时为了维持堆的性质而执行的下沉(sink)方法。以及一些如求左孩子left方法,和求右孩子right......
二叉查找树 二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。它是怎么做到这些的呢?这些都依赖于二叉查找树的特殊结构。二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。...
跳表(skip list) 前面博文(链表相关的)有提过,链表查询一个元素的时间复杂度是O(n)。数组根据下标查找的时间复杂度是O(1),前面的文章也提到过二分查找算法对于元素查找的改变,但是二分查找算法的底层其实是依赖于数组的随机访问特性,分配内存时,对于数组,是需要连续的空间,有时候给数组分配内存时可能会引发频繁的GC。那既然二分查找算法查找性能那么高,但是底层使用数组对内存的要求很高,那可否使用链表来代替元素的存储,即如果元素底层是基于链表存储时能不能有相应效率的“二分查找算法”?其实我们可以稍微对链表进行改造,就可以支持类
详解二叉堆,及优先级队列实现 首先介绍下满二叉树和完全二叉树一、满二叉树,非叶子节点的度为2(有两个子节点),叶子节点全部处于同一层上满二叉树满二叉树除了满足普通二叉树的性质,还具有以下性质:1、满二叉树中第 i 层的节点数为 个。2、深度为 k 的满二叉树必有 个节点 ,叶子数为 。3、满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶...
Leetcode打家劫舍系列问题 Leetcode198你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1...
8皇后问题 8皇后问题的描述见百度百科,这里大概描述下,在如下这种 8 *8的网格里面放入8个皇后,使得放入的这些皇后之间不能相互攻击,即任意两个皇后之间不能处于同一行,不能处于同一列,不能处于同一对角上如上图所示,在图中的位置放置一个皇后之后,阴影部分都不能再放置皇后了,非阴影位置可以继续放置皇后。题目就大概是这个意思。下面采用两种方法来进行解释【方法一】利用位运算的特性来进行说明,位运算可以参考博文初识位运算从题目中我们知道,任意两个皇后之间是不能处于同一行和同一列的,那 8 *...
初识位运算 初识计算机时就听说过一句话,计算机只认识0和,在现代计算机中所有的数据在内存中都是以二进制存在的。位运算直接对位进行操作,如果使用得好,很多时候能够取得很好的效果,下面简要的计算几种常见的位运算及其位运算相关的题。1、与(&)运算符只有当两位都是 1 时结果才是 1,否则为 02、或(|)运算符只有当两位都是 0时结果才为 0,否则为 13、异或(^)运算符当两位相同时,则结果为 0,两位不同时结果为 14、取反(~)运算符位的值为 0则变为 1 ,...
Leetcode相同的树 给两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如下面的两颗二叉树:结构相同,而且对应节点的值是相同的如下面的二叉树,结构不同,所以不能算为是相同的二叉树再比如下面的二叉树,虽然结构相等,但是值不相等,也不能算为相同的二叉树详细题解一、基于递归的解决方法递归函数public boolean isSameTree(TreeNode p, TreeNode q) {}终...
如何找到字符串中的最长回文子串? 什么是回文串?回文串其实就是正读和反读一样的字符串,那我们如何判断一个字符串是回文串?其实实现逻辑也比较简单,我们只需要使用双指针,一个从前往后遍历,一个从后往前遍历,关注遇到的字符是否相等即可。代码如下:private static boolean isPalindromeString(String s) { if (s == null || s.length() == 0) { return true; } in.
接雨水问题 给定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个柱子组成的序列,能装多少水也是同样的道理,找出每...
浅析哈夫曼树和哈夫曼编码 在浅析哈夫曼树之前,先来了解几个关于树的概念1、什么是路劲在树或者图中,从一个点到另一个点所经过的点被称为这两个点之间的路劲。上图中,从跟节点到叶子节点C的路劲就是A B C。2、什么是路劲的长度表示的树或者是图中从一个点到另一个点所经过的边的数量。如下图,从A - > C的路劲就是23、什么是 结点的带权路径长度?将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。如下图。..
浅析Java中的资源关闭 内存是计算机很宝贵的资源,我们在使用资源时如果不关闭打开的资源,就有可能导致内存泄露的风险,下面浅析下Java中几种常见的资源关闭方案先定义一个资源类表示需要关闭的资源public class MyResource implements Closeable { @Override public void close() throws IOException { System.out.println("MyResource的close方法被调用!"); }}