自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2020-05-24 11:21:52 199

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

题目输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。样例算法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 198

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

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

2020-05-24 10:53:50 264 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 229

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

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

2020-05-23 10:58:17 244

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

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

2020-05-23 09:28:42 186

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

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

2020-05-23 09:25:15 213

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

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

2020-05-23 09:21:52 185

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

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

2020-05-22 18:57:53 153

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

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

2020-05-22 15:57:34 140

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

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 193

原创 包含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 116

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

题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例输入:[ [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 120

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

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

2020-05-21 15:04:25 128

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

题目输入一个二叉树,将它变换为它的镜像。样例算法(二叉树,递归) 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 186

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

题目输入两棵二叉树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 224

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

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

2020-05-20 18:18:17 214

原创 链表中倒数第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 152

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

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

2020-05-20 09:45:04 129

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

题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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 173

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

题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入: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 144

原创 反转链表(二十三)

题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入: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 140

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

题目给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出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 134

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

题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。样例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 116

原创 在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 134

原创 设计模式之单例模式

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

2020-05-19 18:51:38 168

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

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

2020-05-17 17:31:05 148

转载 位运算技巧集合

位操作符& 与运算 两个位都是 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 233

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

题目地上有一个 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 198

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

题目实现函数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 141

原创 二进制中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 256

原创 剪绳子(十三)

题目给你一根长度为 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 212

原创 矩阵中的路径(十一)

题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空;所有出现的字符均为大写英文字母;样例:matrix=[[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]]str=“BCCE” , return “true”str

2020-05-16 11:27:07 168

原创 旋转数组的最小数字(十)

题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例输入:nums=[2,2,2,0,1]输出:0算法:(二分) O(n)为了便于分析,我们先将数组中的数画在二维坐标系中,横坐标表示数组下标,纵坐标表示数值,如下所示:图中水平的实线段表示相同元素。

2020-05-16 11:21:20 130

原创 斐波那契数列(九)

题目输入一个整数 n ,求斐波那契数列的第 n 项。假定从0开始,第0项为0。(n<=39)样例输入整数 n=5返回 5算法:(递推) O(n)这题的数据范围很小,我们直接模拟即可。当数据范围很大时,就需要采用其他方式了,可以参考 求解斐波那契数列的若干方法 。用两个变量滚动式得往后计算,a 表示第 n−1 项,b 表示第 n 项。则令 c=a+b表示第 n+1 项,然后让 a,b顺次往后移一位。时间复杂度分析总共需要计算 n次,所以时间复杂度是 O(n)。class So

2020-05-15 21:29:09 396

原创 用两个栈实现队列(八)

题目请用栈实现一个队列,支持如下四种操作:push(x) – 将元素x插到队尾;pop() – 将队首的元素弹出,并返回该元素;peek() – 返回队首元素;empty() – 返回队列是否为空;注意:你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;如果你选择的编程语言没有栈的标准库,你可以使用list或者deque等模拟栈的操作;输入数据保证合法,例如,在队列为空时,不会进行pop或者peek等操作;样例MyQu

2020-05-15 21:16:21 149

原创 二叉树的下一个节点(七)

题目给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;样例:假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。算法分情况讨论1、如果当前节点存在右子树,那么右子树的最左侧节就是当前节点的后继节点。(例如F的后继节点是H)2、如果不存在右子树,就需要沿着father域向上查找,找到第一个是

2020-05-15 21:09:29 134

原创 Redis进阶学习之缓存穿透和雪崩

Redis缓存穿透和雪崩(面试高频,工作常用)Redis缓存的使用,极大地提升了应用程序的性能和效率,特别是数据查询方面。但同时他也带来一些问题,其中最要害的问题就是数据一致性的问题,从严格意义上来讲,这个问题无解。如果对数据一致性要求很高,那么就不能使用缓存。另外一些的典型问题就是,缓存穿透、缓存雪崩和缓存击穿,目前业界也有比较流行的解决方案。缓存处理流程前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。缓

2020-05-15 18:53:02 163

原创 Redis进阶学习之主从复制

Redis主从复制*概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。master以写为主,slave以读为主。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。主从复制的作用主要包括数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。故障

2020-05-15 17:27:22 168

原创 Redis进阶之发布订阅

Redis发布订阅Reids发布订阅(pub/sub)是一种消息通信模式:发送者pub发送消息,订阅者sub接收消息。微信,微博,关注系统!Redis客户端可以订阅任意舒朗的频道订阅/发布消息图第一个:消息发送者,第二个:频道,第三个:消息订阅者下图展示了频道channel1,以及订阅这个频道的三个客户端–client1,client2,client5之间的关系当有新消息通过PUBLISH命令发送给channel1时,这个消息就会被发送给订阅他的三个客户端。测试#订阅者127.0

2020-05-15 11:48:55 142

空空如也

空空如也

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

TA关注的人

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