自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉搜索树与双向链表(三十七)

题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。算法:class Solution { public TreeNode convert(TreeNode root) { if(root == null) return root; Pair<TreeNode,TreeNode

2020-12-01 10:31:00 203

原创 springboot整合redis 重写 redisCacheManager和 reidsTemplate 自定义序列化方式

默认的序列化方式是jdk序列化,我们需要转化为json序列化方式在springboot1.x版本中,重写缓存管理器 //缓存管理器 @Bean public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

2020-11-25 17:23:17 1541

原创 spring boot框架与Redis整合Unexpected character (‘¬‘ (code 172)): expected a valid value

一般修改cacheManager之后会出现这个问题,只要删除redis保存的数据即可。springboot2.3.4重写redisTemplate和redisCacheManagerpackage com.boot01.cache.config;import com.boot01.cache.pojo.Employee;import org.springframework.beans.factory.ObjectProvider;import org.springframework.boot.a

2020-11-25 10:11:43 831

原创 SpringBoot程序后台运行

使用nohup命令让进程后台运行nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 &日志文件名.log : 将日志文件生成在什么位置,若不指定,默认为root目录下2>&1 : 2就是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出么。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的“日志文件名.log”文件中。& : 让进程保持后台运行...

2020-11-08 20:13:39 424

原创 七种join查询

根据图片顺序来看1、内连接(查询a,b公有部分)select * from a inner join b on a.key=b.key;2、左连接(查询a,b共有部分以及a独有的部分)select * from a left join b on a.key=b.key;3、右连接(查询a,b共有部分以及b独有的部分)select * from a right join b on a.key=b.key;4、a独有的部分(左连接减去公有部分)select * from a left j.

2020-08-31 18:17:19 612

原创 手写分页

PageBeanpackage com.pojo;import java.util.ArrayList;import java.util.List;public class PageBean<T> { /**当前页*/ private Integer page; /**每页数据条数*/ private Integer pageSize; /**存放数数据的集合*/ private List<T> list = new Arr

2020-08-31 17:23:11 314

原创 centos6.5安装Mysql5.5.48详细教程

在官网下载mysql rpm包官网地址:https://downloads.mysql.com/archives/community/将下载好的rpm压缩包上传到centos的/opt目录下这里我使用的是filezilla进行上传的将上传的文件解压tar -xvf MySQL-5.5.48-1.linux2.6.x86_64.rpm-bundle.tar正式安装先查看当前系统是否安装过mysqlrpm -qa | grep -i mysql如果存在则需要先进行删除rp

2020-08-29 11:58:39 251

原创 juc并发编程

多线程进阶==>juc并发编程1、什么是juc?**java.util.concurrent *** java.util工具包业务:普通的线程代码 ThreadRunnable 没有返回值,效率比Callable相抵较低!2、线程和进程进程:一个程序 ,QQ.exe 程序的集合;一个进程往往可以包含多个线程,至少包含一个!java默认包含几个线程?2个 main、GC线程:开了一个进程typora,写字,自动保存(线程负责)对于java而言:Thread、Runnable、C

2020-08-05 21:31:28 660

原创 复杂链表的复刻(三十六)

题目请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。注意:函数结束后原链表要与输入时保持一致。算法思想:将当前节点复制一份并且插入到当前节点的后面,然后再链接虚拟节点,最后进行拆分。不能直接返回原链表,系统会判别,最后还要将原链表恢复。class Solution { public ListNode copyRandomList(ListNode head) { //第一次遍历

2020-05-24 11:21:52 214

原创 二叉树中和为某一值的路径(三十五)

题目输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。样例算法class Solution { List<List<Integer>> res = new ArrayList(); List<Integer> path = new ArrayList(); public List<List<Integer>> findPath(Tree

2020-05-24 11:04:23 212

原创 二叉搜索树的后序遍历序列(三十四)

题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。样例输入:[4, 8, 6, 12, 16, 14, 10]输出:true算法后序遍历的最后一个节点是是根节点,所以我们只要找出比根节点小的部分为左子树,然后判断右边部分是否存在比根节点小的值,如果有返回false,否则的话就进行递归调用。class Solution { int[] seq; public boole

2020-05-24 10:53:50 280 1

原创 设计模式之原型模式

原型模式基本介绍原型模式-原理结构图原理结构图说明1、Prototype:原型类,声明一个克隆自己的接口。2、ConcretePrototype:具体的原型类,实现一个克隆自己的操作。3、client:让一个原型对象克隆自己,从而创建一个新的对象(属性一样)原型模式-代码实现1、创建实体类,实现cloneable接口,重写clone方法。package prototype;/** * @Date 2020/5/23 下午4:19 * @Created by zhaoli *

2020-05-23 23:52:03 243

原创 设计模式之抽象工厂模式

抽象工厂:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。定义抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。使用场景优点缺点如何实现1、定义抽象产品类package factory.abstractfactory.product;/** * @Date 2020/5/23 上午10:33 * @Created by zhaoli * 手机抽象类 */public interface IPhoneProduct {

2020-05-23 10:58:17 257

原创 之字形打印二叉树(三十三)

题目请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例算法相比于上一题,这道题仅需要增加一个标志位,我这里采用是一个整数,如果是奇数则正序打印,偶数翻转。时间复杂度 O(n)class Solution { public List<List<Integer>> printFromTopToBottom(TreeNode root) {

2020-05-23 09:28:42 197

原创 分行从上往下打印二叉树(三十二)

题目从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例算法BFS(O(n))依旧是宽度优先遍历,相比不分行从上到下打印,只需要记住这一层需要弹出队列多少次数即可,对应代码里面的n。当队列不为空时记录下当前队列的长度n,这个长度对应树的当前层有多少个节点相比较上一题,这次在一个循环里面,只弹出n个节点就好了。弹出过程中存储当前节点到temp数组弹出n个节点之后,将temp数组存入result时间复杂度每个节点遍历1遍,O(N)复杂度class Sol

2020-05-23 09:25:15 225

原创 不分行从上往下打印二叉树(三十一)

题目从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例算法(BFS) O(n)我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。这样我们会:先扩展根节点;再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点;再依次从左到右扩展第三层节点;依次类推所以BFS的顺序就是这道题目要求的顺序。时间复杂度BFS时每个节点仅被遍历一次,所以时间复杂度是 O(n)。class Solution { public List<In

2020-05-23 09:21:52 201

原创 设计模式之工厂方法模式

前言在上文提到的:简单工厂模式,发现简单工厂模式存在一系列问题:工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。为了解决上述的问题,我们又使用了一种新的设计模式:工厂方法模式。工厂方法模式定义**工厂方法模式:**定义了一个创建对象的抽象方

2020-05-22 18:57:53 167

原创 设计模式之简单工厂模式

什么是简单工厂模式(静态工厂模式)1)简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单的实用模式。2)简单工厂模式:定义一个创建对象的类,这个类来封装实例化对象的行为。3)在软件开发中,当我们会用到大量创建某种,某类或者某批对象,就会使用到工厂模式。如何实现简单工厂模式工厂模式有什么用处...

2020-05-22 15:57:34 155

原创 栈的压入、弹出序列(三十)

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。样例输入:[1,2,3,4,5][4,5,3,2,1]输出:true算法(栈) O(n)用一个新栈s来模

2020-05-22 14:56:26 226

原创 包含min函数的栈(二十九)

题目设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例:MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minStack.push(-4);minStack.getMin(); --> Returns -4.minStack.

2020-05-22 14:52:45 128

原创 顺时针打印矩阵(二十八)

题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例输入:[ [1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]算法(模拟) O(n^2)我们顺时针定义四个方向:上右下左。从左上角开始遍历,先往右走,走到不能走为止,然后更改到下个方向,再走到不能走为止,依次类推,遍历 n^2 个格子后停止。时间复杂度矩阵中每个格子遍历一次,所以总时间复杂度是 O(n^2)。cla

2020-05-22 14:47:59 133

原创 对称的二叉树(二十七)

题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例算法(二叉树,递归) O(n)递归判断两个子树是否互为镜像。两个子树互为镜像当且仅当:两个子树的根节点值相等;第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像;时间复杂度从上到下每个节点仅被遍历一遍,所以时间复杂度是 O(n)。class Solution { public boolean isSymmetric(TreeNo

2020-05-21 15:04:25 138

原创 二叉树的镜像(二十六)

题目输入一个二叉树,将它变换为它的镜像。样例算法(二叉树,递归) O(n)我们可以发现镜像后的树就是将原树的所有节点的左右儿子互换!所以我们递归遍历原树的所有节点,将每个节点的左右儿子互换即可。时间复杂度原树仅被遍历一次,所以时间复杂度是 O(n)。class Solution { public void mirror(TreeNode root) { if(root == null) return ; if(root.left != null |

2020-05-21 15:01:11 198

原创 树的子结构(二十五)

题目输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例树A:树B:返回 true ,因为B是A的子结构。算法(二叉树,递归) O(nm)代码分为两个部分:遍历树A中的所有非空节点R;判断树A中以R为根节点的子树是不是包含和树B一样的结构,且我们从根节点开始匹配;对于第一部分,我们直接递归遍历树A即可,遇到非空节点后,就进行第二部分的判断。对于第二部分,我们同时从根节点开始遍历两棵子树:如果树B中的节点为空,则表示当前分支是匹配的,返回true

2020-05-21 14:57:20 234

原创 MySQL数据库的四种隔离级别

事务的 四个特征(ACID)事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做2 、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断

2020-05-20 18:18:17 229

原创 链表中倒数第k个节点(二十一)

题目输入一个链表,输出该链表中倒数第k个结点。注意:k >= 0;如果k大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4算法先翻转链表然后遍历输出第k个节点。时间复杂度O(n)class Solution { public ListNode findKthToTail(ListNode pListHead, int k) { if(pListHead == null) return n

2020-05-20 09:47:36 161

原创 调整数组顺序使奇数位于偶数前面(二十)

题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]算法(双指针扫描) O(n)用两个指针分别从首尾开始,往中间扫描。扫描时保证第一个指针前面的数都是奇数,第二个指针后面的数都是偶数。每次迭代时需要进行的操作:第一个指针一直往后走,直到遇到第一个偶数为止;第二个指针一直往前走,直到遇到第一个奇数为止;交换两个指针指向的位置上的数,再进入下一层迭代

2020-05-20 09:45:04 138

原创 表示数值的字符串(十九)

题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。注意:小数可以没有整数部分,例如.123等于0.123; 小数点后面可以没有数字,例如233.等于233.0;小数点前面和后面可以有数字,例如233.666; 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;当e或E后面没有整数时

2020-05-20 09:41:23 188

原创 合并两个排序的链表(二十四)

题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5算法(二路归并) O(n)新建头部的保护结点dummy,设置cur指针指向dummy。若当前l1指针指向的结点的值val比l2指针指向的结点的值val小,则令cur的next指针指向l1,且l1后移;否则指向l2,且l2后移。然后cur指针按照上一部设置好的位置后移。

2020-05-20 09:35:02 153

原创 反转链表(二十三)

题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL算法class Solution { public ListNode reverseList(ListNode head) { ListNode NewHead = null,temp; while(head != null){

2020-05-20 09:32:37 153

原创 链表中环的入口结点(二十二)

题目给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.算法(链表,快慢指针扫描) O(n)本题的做法比较巧妙。用两个指针 first,second 分别从起点开始走,first 每次走一步,second每次走两步。如果过程中 second 走到null,则说明不存在环。否则

2020-05-20 09:28:21 146

原创 删除链表中重复的节点(十七)

题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。样例1输入:1->2->3->3->4->4->5输出:1->2->5样例2输入:1->1->1->2->3输出:2->3算法(线性扫描) O(n)为了方便处理边界情况,我们定义一个虚拟元素 dummy 指向链表头节点。然后从前往后扫描整个链表,每次扫描元素相同的一段,如果这段中的元素个数多于1个,则将整段元素直接删除

2020-05-20 09:19:44 124

原创 在O(1)时间删除链表结点(十六)

题目给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。样例输入:链表 1->4->6->8删掉节点:第2个节点即6(头节点为第0个节点)输出:新链表 1->4->8算法(链表) O(1)由于是单链表,我们不能找到前驱节点,所以我们不能按常规方法将该节点删除。我们可以换一种思路,将下一个节点的值复制到当前节点,然后将下一个节点删除即可。时间复杂度只有常数次操作,所以时间复杂度是 O(1)。c

2020-05-20 09:11:29 145

原创 设计模式之单例模式

什么是单例模式所谓类的单例模式,就是就采取一定的方法保证整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个获取其对象实例的方法(静态方法)。怎么实现单例模式饿汉式(静态常量)步骤如下:a、构造器私有化(防止new)b、类的内部创建对象c、向外暴露一个静态的公共方法。getInstance()d、代码实现//饿汉式(静态变量)class Singleton{ //1、构造方法私有化,防止外部new private Singleton(){ } //

2020-05-19 18:51:38 184

原创 设计模式学习之六大原则

设计模式学习之六大原则开闭原则:用抽象构建架构,用实现扩展原则;开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。这个原则其实有两个特征,一个是说对于扩展是开放的,另一个是说对于更改是封闭的。(总纲)单一职责原则:单一职责原则指的是对于一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者一致这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意向不到的破坏。接口分

2020-05-17 17:31:05 161

转载 位运算技巧集合

位操作符& 与运算 两个位都是 1 时,结果才为 1,否则为 0,如 1 0 0 1 1& 1 1 0 0 11 0 0 0 1| 或运算 两个位都是 0 时,结果才为 0,否则为 1,如1 0 0 1 1| 1 1 0 0 11 1 0 1 1^ 异或运算,两个位相同则为 0,不同则为 1,如1 0 0 1 1^ 1 1 0 0 10 1 0 1 0~ 取反运算,0 则变为 1,1 则变为 0,如~ 1 0 0 1 10 1 1 0 0

2020-05-17 15:44:42 246

原创 机器人的运动范围(十二)

题目地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 k 的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),

2020-05-17 12:00:30 209

原创 数值的整数次方(十五)

题目实现函数double Power(double base, int exponent),求base的 exponent次方。不得使用库函数,同时不需要考虑大数问题。注意:不会出现底数和指数同为0的情况当底数为0时,指数一定为正样例1输入:10 ,2输出:100样例2输入:10 ,-2输出:0.01算法二分法 如果exponent为偶数 Power(base,exponent)=Power(base,exponent/2)Power(base,exponent/2),如果

2020-05-17 11:53:01 155

原创 二进制中1的个数(十四)

题目输入一个32位整数,输出该数二进制表示中1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9 输出:2解释:9的二进制表示是1001,一共有2个1。样例2输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110,一共有31个1。算法使用n&(n-1)来计算n二进制中一的个数,这个操作会将原来最右边的1变成0时间复杂度O(logn)class Solution { publi

2020-05-17 11:47:13 268

原创 剪绳子(十三)

题目给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。样例输入:8输出:18算法:当n<5时,我们会发现,无论怎么剪切,乘积product <= n,n为4时,product最大为2*2=4;当n>=5时,可以证明2(n-2)

2020-05-17 11:13:59 229

空空如也

空空如也

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

TA关注的人

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