编程历程
文章平均质量分 60
笑忘哭
路痴的救赎
展开
-
【画图分析】Leetcode 201 题 数字范围按位与(标签:位运算)
文章目录题目描述思路分析技术公众号:小猿君的算法笔记题目描述给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。示例1:输入:[5,7]输出:4示例2:输入:[0,1]输出:0思路分析按照题目的要求,如果逐个按位与,那么在 m 、n 范围较大的情况下,将会出现超时。对题目中所给用例 [5,7] 按位与运算:1、可以看到,5 和 7 二进制形式存在公共前缀 01 ,因此从 5 →原创 2021-02-27 21:29:28 · 295 阅读 · 1 评论 -
查找服务器中 nginx 所使用的 nginx.conf 配置文件位置
一般情况下,可以使用 nginx -t 命令查看 nginx.conf 所在位置。# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful如果 nginx 命令无法直接执行,我们可以通过一些方式查找 :ps -ef | grep nginxroot 3235 1原创 2021-02-24 20:07:33 · 7793 阅读 · 0 评论 -
【思路分析】Leetcode 111 题 二叉树的最小深度(标签:树、深度优先搜索)
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 :输入:root = [3,9,20,null,null,15,7]输出:2思路分析① 保存一个全局遍历 min 作为最小深度。② 搜索叶子节点,将该节点的深度 level 与 min 比较,取较小者。代码描述使用 Java 进行代码描述:class Solution { i原创 2021-02-13 14:03:20 · 662 阅读 · 5 评论 -
Leetcode 107 题 二叉树的层序遍历 II(标签:树、深度优先搜索)
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],原创 2021-02-13 13:47:35 · 200 阅读 · 2 评论 -
Leetcode 191 题 位 1 的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。思路分析方法一、计算每一位是否为 1显然,我们可以通过判断数中每一位是否为 1 求得位 1 的个数。① 获得最低位是否为 1,通过 n & 1,若结果为 1 ,说明最低位为 1,否则最低位为 0。② 通过位移更新最低位, n >>= 1,移位 32 次后,n 中的每一位都会被获得。publi原创 2021-02-09 12:17:59 · 145 阅读 · 0 评论 -
Leetcode 199 题 二叉树的右视图
题目描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1, 3, 4]解释:思路分析显然,我们需要获得每层最右边的元素,加入到结果集中。「广度优先搜索」层序遍历,按照从右到左的顺序访问节点,每层第一次被访问的元素即为最右边元素。class Solution { public List<Integer> rightSideView(TreeNode root)原创 2021-01-27 23:37:13 · 125 阅读 · 0 评论 -
Leetcode 203 题 移除链表元素(标签:链表)
题目描述删除链表中等于给定值 val 的所有节点。示例:输入:1->2->6->3->4->5->6, val = 6输出:1->2->3->4->5思路分析「使用双指针」为了方便处理,可以利用哑节点记录表头节点。使用双指针 pre 和 cur 分别指向上一个节点和当前节点。如果当前节点为需要被删除的目标节点,那么上一个节点的指针就要指向当前节点的下一个节点。class Solution { public ListN原创 2021-01-23 15:34:32 · 218 阅读 · 0 评论 -
Leetcode 134 题 加油站(标签:贪心算法)
题目描述在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例:输入:gas = [1,2,3,4,5]cost = [3,4,5,1,2]输原创 2021-01-19 22:02:57 · 317 阅读 · 0 评论 -
X-Forwarded-For 客户端 IP 伪造过程及防范
最近收到一条安全漏洞报告,通过利用代码漏洞,并结合HTTP扩展请求头 X-Forwarded-For 可以对客户端IP进行伪造,以达到非法目的。下面我将对这个漏洞进行介绍。X-Forwarded-For 介绍X-Forwarded-For 是一个 HTTP 扩展头部,用来表示HTTP请求端真实 IP,HTTP/1.1 协议并没有对它的定义,但现如今X-Forwarded-For已被各大 HTTP 代理、负载均衡等转发服务广泛使用。X-Forwarded-For 请求头格式:X-Forwarded-原创 2021-01-18 22:27:51 · 7440 阅读 · 2 评论 -
Leetcode 540 题 有序数组中的单一元素
题目描述给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例:输入: [1,1,2,3,3,4,4,8,8]输出: 2注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。思路分析「思路一」由于每个元素都会出现两次,寻找只出现一次的元素,我们可以想到的是使用异或,我们可以利用异或的特性,相同为0,那么出现两次的结果都会被异或为0,剩下的那一位就是我们需要的结果。「思路二」到目前为止,题目所给的有序数组这一条件我们似乎并没原创 2021-01-14 23:31:50 · 435 阅读 · 0 评论 -
Leetcode 354 题 俄罗斯套娃信封问题
题目描述给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。原创 2021-01-11 22:33:29 · 477 阅读 · 0 评论 -
Leetcode 300 题 最长递增子序列
题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。思路分析这道题求最长上升子序列,我们可以定义一个 dp 数组,dp[i] 表示以 nums[i] 为最后一个元素时,最长上原创 2021-01-09 18:52:03 · 5108 阅读 · 1 评论 -
Leetcode 417 题 太平洋大西洋水流问题
题目描述给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。示例:给定下面的 5x5 矩阵:返回:[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元)。思路分析原创 2021-01-02 14:38:26 · 525 阅读 · 0 评论 -
Leetcode 1370 题 上升下降字符串
题目描述给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出最小的字符,将它接在结果字符串的后面。从 s 剩余字符中选出最小的字符,且该字符比上一个添加的字符大,将它接在结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出最大的字符,将它接在结果字符串的后面。原创 2020-12-22 23:20:43 · 127 阅读 · 0 评论 -
Linux使用netstat命令
netstat命令介绍netstat命令可以获取Linux系统网络相关数据,用于对网络相关问题的排查。netstat输出介绍netstat输出列名介绍如下:Proto:协议(TCP协议或者UDP协议)Recv-Q:接收队列,连接此套接字的用户程序未拷贝的字节数Send-Q:发送队列,远程主机未确认字节数Local Address:本地地址及端口号Foreign Address:远程地址及端口号State:链路状态PID/Program name:进程ID和使用该套接字的应用程序原创 2020-10-17 20:50:47 · 355 阅读 · 0 评论 -
Linux使用rz、sz命令进行文件上传下载
命令的安装rz和sz命令可以让我们很方便的将文件在本地和服务器之间上传和下载。我所使用的阿里云服务器,系统是Ubuntu系统,当输入rz命令,系统将出现以下提示。很明显,我们需要根据提示安装lrzsz。sudo apt-get updatesudo apt-get install lrzsz使用rz命令进行文件上传使用xshell登录服务器,当我们输入rz命令,系统将会出现弹框,我们选择需要上传的文件进行上传即可。使用sz命令进行文件下载使用xshell登录服务器,输入sz原创 2020-06-27 01:02:02 · 431 阅读 · 0 评论 -
MongoDB之Spring Data MongoDB
这里创建springboot工程,使用spring data mongodb,首先需要创建工程,引入坐标。<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.1.8.RELEASE</version></dependency&原创 2020-06-26 19:43:20 · 9077 阅读 · 0 评论 -
MongoDB之基本使用
MongoDB简介MongoDB是为了快速开发互联网Web应用而设计的数据库系统。MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。MongoDB的数据抹香香是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)。下载安装MongoDB(Ubuntu)安装MongoDBsudo apt-get install mongodb查看MongoDB版本mongo -version连接MongoDBmo原创 2020-06-26 19:25:30 · 153 阅读 · 0 评论 -
Java并发编程之AQS原理
AQS框架基本特性与结构Java并发包当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronize简称AQS。AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。AQS核心AQS核心有三点:自旋:控制线程不跳出逻辑LockSupport类中有park(线程阻塞)、unpark...原创 2019-12-03 16:24:26 · 277 阅读 · 0 评论 -
Spring之Bean的生命周期
什么是Bean的生命周期Bean的生命周期指的是Bean创建→初始化→销毁的过程我们可以自定义Bean初始化和销毁方法容器在Bean进行到当前生命周期的时候,来调用自定义的初始化和销毁方法。初始化与销毁——自定义方法我们创建一个Bike类public class Bike { public Bike() { System.out.println("Bike 构造方法");...原创 2019-12-03 16:01:08 · 170 阅读 · 0 评论 -
Spring之Bean的加载方法
@Configuration该注解作用在类上,告诉Spring这是一个配置类,与XML效果是一样的,我们接下来所使用的注解,需要在配置类中使用。ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);@Bean将@Bean放在方法上使用,能够将Bean加入到IOC容器中,其返回...原创 2019-12-03 15:56:02 · 1062 阅读 · 0 评论 -
设计模式之责任链模式
什么是责任链模式责任链设计模式主要构成有抽象处理者、具体处理者、客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样链路上所有处理对象都有机会处理请求,使发送者与接收者之间解耦。使用场景当请求到来时,不知道由哪个具体对象去处理或者每个对象都需要处理请求的时候,可以使用责任链模式。比如在论坛发表一篇文章,后台需要经过一系列处理(过滤、敏感词等)才可以发表或进入数据库,这时...原创 2019-12-03 15:27:45 · 187 阅读 · 0 评论 -
设计模式之观察者模式
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。观察者模式包含四个角色:抽象主题(Subject)、具体主题、抽象观察者(Observer)、具体观察者观察者模式的实现我们创建一个彩票的主题,以购彩者作为观察者,向彩票主题进行注册,而彩票主题则向购彩者进行通知,来实现观察者模式。下面是一个...原创 2019-12-03 15:19:27 · 129 阅读 · 0 评论 -
Java基础之内省机制
内省机制Java中提供了一套API用来访问某个属性的getter/setter方法,这些API存放与包java.beans中,一般的做法是通过类Introspector的getBeanInfo方法来获取摸个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后...原创 2019-12-03 15:09:43 · 224 阅读 · 0 评论 -
MySQL之分组函数
分组函数分组函数是对表中的一组记录进行操作,每组返回一个结果。分组函数一共5个COUNT 求总数SUM 求总和AVG 求平均数MAX 求最大数MIN 求最小数分组函数的特点分组函数自动忽略NULL,例如下面的查询SELECT COUNT(time) FROM act_user;如果time中存在NULL字段,那么分组函数自动忽略。...原创 2019-10-19 11:38:14 · 816 阅读 · 0 评论 -
通过两种方式获取百度首页源代码(python3)
一、通过urllib.request模块import urllib.requests=urllib.request.urlopen("http://www.baidu.com")print(s.read())二、通过requests模块首先通过谷歌浏览器进入百度首页,点击f12,然后刷新页面,可以看到如下图所示,我们可以获取User-Agent复制User-Agent串,创建一个字典head=...原创 2018-04-12 20:53:01 · 4110 阅读 · 1 评论 -
Redis的事务
简介Redis事务可以一次执行多个命令(允许在一个单独的步骤中执行一组命令),按顺序地串行化执行,执行过程中不会被其他命令插入,不许加塞。在输入 MULTI 命令开始,输入的命令会依次进入命令队列,但不会执行。输入 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余命令依然执行。在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令序列中。R...原创 2019-05-24 17:06:02 · 113 阅读 · 0 评论 -
Redis发布订阅
简介Redis发布订阅是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。命令订阅频道:SUBSCRIBE channel [channel] #订阅给定的一个或多个频道的信息PSUBSCRIBE pattern [pattern] #订阅一个或多个符合给定模式的频道发布频道:PUBLI...原创 2019-05-24 17:02:58 · 202 阅读 · 0 评论 -
Java基础之自动装箱和拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行的自动转换。JDK1.5 后,Java引入了自动装箱(autoboxing)、拆箱(unboxing)自动装箱基本类型的数据处于需要对象的环境中时,会自动转为”对象“以Integer为例,在JDK1.5以前,这样的代码 Integer i=5 是错误的,必须要通过Integer i=new Integer(5) 这样的语句来实...原创 2019-05-24 16:49:48 · 154 阅读 · 0 评论 -
Java基础之Arrays工具类的使用
JDK提供的java.util.Arrays类,包含了常用的数组操作,方便我们日常开发。Arrays类包含了:排序、查找、填充、打印内容等常见操作。打印数组int a[]= {1,2};System.out.println(a); //打印数组引用的值System.out.println(Arrays.toString(a)); //打印数组元素的值此处的Array...原创 2019-05-24 16:46:36 · 332 阅读 · 0 评论 -
Redis实现分布式锁
锁的处理单应用中使用锁:单进程多线程使用 synchronized 或 Lock 实现该场景下的锁机制分布式应用中使用锁:多进程分布式锁的实现方式数据库的乐观锁基于zookeeper的分布式锁基于redis的分布式锁分布式锁的注意事项互斥性:在任意时刻,只有一个客户端能持有锁同一性:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了避免死锁:即...原创 2019-05-06 16:21:14 · 137 阅读 · 0 评论 -
Redis使用JavaAPI
安装加载redis驱动包连接到Redis服务器//连接redis服务Jedis j=new Jedis("10.2.6.63",6379);//查看服务是否运行System.out.println(j.ping());String类型数据实例//连接redis服务Jedis j=new Jedis("10.2.6.63",6379);List<String...原创 2019-05-06 16:12:49 · 1182 阅读 · 0 评论 -
Redis持久化的取舍和选择
Redis持久化的两种方式redis是一个支持持久化的内存数据库,也就是说,redis需要经常有内存中的数据同步到硬盘来保证持久化。为了保证数据数据的持久性,它提供了两种持久化方式。RDB方式 AOF方式RDB什么是RDBRDB是通过一条命令,将Redis内存中的数据完整的生成一个快照,然后保存到硬盘中,也就是RDB文件。RDB文件将内存中的数据以快照的方式写入二进...原创 2019-05-06 16:06:29 · 496 阅读 · 0 评论 -
Redis主从复制(Centos7)
主从复制1、主服务器可以拥有多个从服务器2、多个从服务器可以连接同一个主服务器外,还可以连接到其他从服务器3、主从复制不会阻塞主服务器,在同步数据时,主服务器可以继续处理客户端请求4、提供系统的伸缩性主从复制过程1、从服务器与主服务器建立连接,发送sync同步命令2、主服务器开启一个后台进程,将数据库快照保存到文件中,同时主服务器主进程会开始搜集新的写命令并缓存3、后台完成保...原创 2019-05-06 13:21:04 · 211 阅读 · 0 评论 -
缓存设计与优化
缓存的受益与成本受益加速读写通过缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果。降低后端负载后端服务器通过前端缓存降低负载:业务端使用Redis降低后端MySQL负载等。成本数据不一致:缓存层和数据层有时间窗口不一致,和更新策略有关。 代码维护成本:多了一层缓存逻辑...原创 2019-05-21 16:22:33 · 481 阅读 · 0 评论 -
Java基础之RandomAccessFile随机访问流
RandomAccessFile介绍随机访问文件,自身具备读写方法通过skipBytes(int x),seek(int x)来达到随机访问特点该对象既能读,又能写该对象维护了一个byte数组,并通过指针可以操作数组中的元素可以通过getFilePointer方法获取指针的位置,通过seek方法设置指针的位置其实该对象就是将字节输入流和输出流进行了封装该...原创 2019-05-21 16:29:49 · 949 阅读 · 0 评论 -
Java基础之浮点型变量和BigDecimal的使用
带小数的数据在Java中称为浮点型,浮点型可以分为float类型和double类型。 类型 占用存储空间 表数范围 float 4字节 -3.403E38~3.403E38 double 8字节 -1.798E308~...原创 2019-05-21 16:37:17 · 1355 阅读 · 0 评论 -
Redis的虚拟内存
应用场景对于大多数数据库而言,最好的运行方式就是讲所有数据都加载到内存中,之后的查询操作完全基于内存数据来实现,但这在实际的情况下并不多见,多数情况下只有部分数据可以被加载到内存中,在Redis中,有一个重要的概念,那就是key一般不会被交换,如果你的数据库中存在大量key,那么这种场景就不适合使用虚拟内存,如果恰恰相反,你的数据库中只包含少量key,而每一个key所包含的value很大,那么...原创 2019-08-29 21:51:16 · 769 阅读 · 0 评论 -
Java8新特性之Lambda表达式
为什么需要Lambda表达式在Java中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数方法。Lambda表达式为Java添加了缺失的函数式编程的特性,使我们能将函数当做一等公民看待,在Java中,Lambda表达式是对象,他们必须依附于一类特别的对象类型——函数式接口。下面是一个普通的Swing程序使用匿名内部类与Lambda的写法 JFrame jFrame=new J...原创 2019-07-05 10:47:21 · 706 阅读 · 0 评论 -
Java8新特性之方法引用
方法引用前面讲过Lambda表达式,而方法引用是Lambda表达式的一种特殊情况,或者说,是Lambda表达式的一种语法糖。方法引用的分类方法引用可以分为4类:1、类名::静态方法名2、引用名(对象名)::实例方法名3、类名::实例方法名4、构造方法引用:类名::new类名::静态方法名测试自定义学生类public class Student{ private...原创 2019-07-08 12:50:11 · 306 阅读 · 0 评论