自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java HTTP编程

java.net包URL,Uniform Resource Locator,代表一个资源;URLConnection:获取资源的连接器;根据URl的openConnection()方法获取URLConnection;connect方法,建立和资源的连接通道;getInputStream方法,获取资源的内容;HTTP Client包java.net.http包取代URLConn...

2019-04-10 17:25:46 688

原创 Redis 02 Redis实现分布式理论基础

增加一个Redis节点时,数据命中率显著下降,可能会造成穿过cache,直击DB。一致性hash(Consistent Hashing)将对象和cache都映射到同一个hash数值空间中,并且使用相同的hash算法。顺时针分类到第一个遇到的cache中。当删除或增加一个节点时,只会影响后面一个节点cache。可能的问题:cache节点分布的极不均匀(Hash倾斜性);Hash倾斜性...

2019-04-09 10:55:37 141

原创 Json字符串与对象的转换

通常在返回信息给前端时,需要将对象转换成Json字符串,在实现分布式Session时,需要将对象持久化到Redis数据库中,也需要将其转换成字符串的方式,将Cookie作为键,用户对象转成的Json字符串作为值。此外,持久化的对象可能是一个容器,下文也包含相应的解决方案。注意:对象不能含有构造器。下面代码为通用的解决方案,依赖jar包: <dependency>...

2019-04-08 16:26:43 166

原创 HashMap存在的问题

哈希碰撞的概率取决于hashCode 计算方式和空间容量大小。死链问题在JDK8以前,由于倒序插入,transfer()函数会造成死链的形成(具体分析过程见死链的形成 )。JDK8的解决方案是声明两对指针,维护两个链表,一次在末端添加新的元素。数据丢失问题并发赋值时被覆盖;已遍历区间新增元素会丢失;新表被覆盖;1.多线程丢失新添加的元素直接放在slot槽中,一个线程的赋值可能会...

2019-04-07 13:22:37 335

原创 Redis 01 基础知识

文章目录基本指令主从复制:事务:持久化机制虚拟内存基本指令语句含义redis-server开启Redis服务器redis-cli开启Redis服务端set mykey somevalue设置键和值get mykey根据键获得值set mykey newval nx如果不存在键mykey,则设置键和值set mykey newval x...

2019-03-02 21:39:03 131

原创 剑指Offer 34 丑数

题目把只包含因子2、3和5的数称为丑数,求从小到大的顺序的第1500个数。1是第一个丑数。思路一个丑数可以表示成2m3n5k2^m3^n5^k2m3n5k,其中,m、n、k为自然数ZZZ。丑数从小到大的顺序其实是m、n、k这三个数中的其中一个数加一。生成过程:数组res初始化,存储了第一个元素res[0]=1;比较m、n、k分别加1后值的大小,将res[m]*2,res[n]*3,...

2019-02-22 12:53:43 132

原创 剑指Offer 33 把数组排成最小的数

题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

2019-02-19 16:01:47 88

原创 剑指Offer 32 从1到n整数中1出现的次数

题目输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。思路本文思路主要参考从1到n整数中1出现的次数:O(logn)算法注意是求1出现的次数,而不是求包含1的数字的个数。对于一个数abcde,个位出现1的个数为abcd;十位出现1的个数:如果d&gt;1,为abc10+10;如果d==1,为abc10+e+1;如果&lt;1,则为abc*10;同理可以求百位。pu...

2019-02-18 19:13:17 116

原创 剑指Offer 31 连续子数组的最大和

题目输入一个整形数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求复杂度为O(n)。思路从前往后相加为currentSum,如果发现累加和为负数,丢掉之前的累加和;greatestSum保存最大的值。public class Q31FindGreatestSumOfSubArray { /** * 当累加和出现负数时...

2019-02-18 16:26:07 83

原创 剑指Offer 30 最小的K个数

题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路方法一:复杂度O(n)O(n)O(n);当可以修改输入的数组时,可以采用类似于快速排序的思路,最终使得比array[k-1]小的数字在它的左边,而比array[k-1]大的数字在它的右边,最终返回k-1以前的元素。首先进行一次partition,得到一个i...

2019-02-16 20:51:17 89

原创 剑指Offer 29 数组中出现次数超过一半的数字

题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。思路方法1:快速排序使得序列有序,返回最中间的数。快速排序:在数组中随机选择一个数字,调整数组中数字的顺序,使得比选中数字小的元素排在它的左边,比选中数字大的数字排在它的右边;再递归的对低子表和高子表进行排序;快速排序的优化:优化中心枢轴:可以三数取中,取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、中间和右...

2019-02-08 17:51:28 88

原创 剑指Offer 28 字符串的排列

题目输入一个字符串,打印出该字符串中字符的所有排列。思路首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换;然后固定一个字符,求后面所有字符的排列;可能出现在第一个位置的字符为stringBuilder.charAt(index),index为其中任意一个字符;在固定了在index位置的一个字符后,求后面所有字符的排列,递归调用permutation(stringB...

2019-02-08 13:22:08 140

原创 剑指Offer 27 二叉搜索树与双向链表

题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整结点指针的指向。思路对于二叉搜索树,采用中序遍历按照从小到大的顺序遍历二叉树的每一个结点,因此,只需要记录上一个结点lastNodeInList,将其和当前遍历的结点连接起来,便可实现转换。初始化:需要一个共享的静态变量lastNodeInList,以便在两次递归调用中传递上一次的结果。初始...

2019-02-08 12:16:38 87

原创 剑指Offer 26 复杂链表的复制

题目复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个指针指向链表中的任意结点或者null。思路方法一:创建哈希表,用空间换时间方法二:分成三部分,分别实现根据原始链表的每个结点N创建对应的N’,并把N’连接在N后面设置复制出来的结点的sibling把长链表分成两个链表public class Q26Clone { static class...

2019-02-07 20:46:44 104

原创 剑指Offer 25 二叉树中和为某一值的路径

题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。思路前序遍历二叉树,并用一个栈stack来存储路径,用一个变量sumPath存储路径之和;每当前序遍历从子结点返回父节点时,弹出该子结点,并且sumPath减去该结点的值;findPath(BiTreeNode root,int expectedSum)创...

2019-02-07 18:24:59 120

原创 剑指Offer 24 二叉搜索树的后序遍历序列

题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。思路定义描述二叉排序(搜索)树(Binary Sort Tree)又称为二叉查找树,或者是一棵空树,或者满足:1、若它的左子树不空,则左子树上所有的结点的值均小于它的根结点的值;2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。对于一个后序遍历序...

2019-02-07 16:23:00 80

原创 剑指Offer 23 从上往下打印二叉树

题目从上往下打印出二叉树的每个结点,同一层的结点从左到右的顺序打印。思路要求同一层的结点从左向右顺序打印,可以想到队列;对于根节点,压入队列的顺序是先左结点,后右结点;考虑第二层,左子树的左结点、右结点进入队列,此时队列第一位为右子树根节点,故将右子树的左结点和右结点压入队列,可以看到第三层是有序的按照数学归纳法,假设第k层是有序的,队列中存储着有序的第k层的各个结点,递推到第k+1层...

2019-02-07 12:36:54 82

原创 剑指Offer 22 栈的压入、弹出序列

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。思路注意压入栈的元素可以随时弹出,因此弹出序列有多种;创建一个辅助栈,按照压入序列向栈中压入元素;每当压入一个元素时,如果这个元素刚好是弹出序列元素,那么直接弹出;如果不是,则把压栈序列中还没有入栈的数字压入辅助栈,直到栈顶元素为相应弹出序列元素;如果所有元素都压入栈而和按照弹出顺序的元素都不相等,...

2019-02-07 11:55:54 122

原创 剑指Offer 21 包含min函数的栈

题目定义栈的数据结构,实现一个能够得到栈的最小元素的min函数。调用min,push和pop的时间复杂度都是O(1)。思路错误的思路:设置一个成员变量,如果添加的元素变量比它小,则更新该成员变量。这种思路当从栈中弹出了最小元素,如何保证该成员变量是最小的;正确的做法是将每次的最小元素都保存在另外一个辅助栈中;注意边界条件:当栈为空时返回栈的最小值。public class Q21...

2019-02-06 20:51:19 95

原创 剑指Offer 20 顺时针打印矩阵

题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。思路采用一个二维数组来输入矩阵元素;顺时针打印一个二维数组,将二维数组分成多个圈,起点为(start,start),从外圈向内圈循环遍历,循环继续的条件是数组的列和行都大于2∗start2*start2∗start;由于最后一圈可能退化成只有一行或者一列,将打印一圈分成四个过程,如下图所示:过程1是必须的;过程2的前提...

2019-02-06 18:12:19 106

原创 剑指Offer 19 二叉树的镜像

题目输入一个二叉树,输出它的镜像。思路首先考虑对应单一一个结点,交换其左右结点需要一个引用temp来暂存一个结点,以便交换。此时要注意三种情况:两个结点都不为null;有一个结点为null;两个结点都为null。其实此处可以不管,虽说第三种不需要交换,但是需要增加对每个结点判断其左右结点是否为null,这时可以直接把这种情况也直接交换,以减少判断。此外,注意鲁棒性,mirror()函数输...

2019-02-06 16:43:55 90

原创 剑指Offer 18 树的子结构

题目输入两棵二叉树A和B,判断B是不是A的子结构。思路首先在A树中找到树B的根节点node,再比较两个树node和B是否相等;比较node是否包含B的树结构:采用递归的方式,遍历时只要有一个结点值不相等,就返回false;当B的子结点到达尾部null时,返回true;而如果B的子节点不为null,node的子结点为null时,要返回false,这个检查要在比较树结点值前进行,否则会...

2019-02-06 16:05:06 61

原创 大话数据结构 03 排序

文章目录排序定义简单排序冒泡排序简单选择排序直接插入排序改进排序希尔排序堆排序归并排序快速排序排序定义定义描述排序假设n个记录的序列为{r1,r2,...,rn}\{r1,r2,...,rn\}{r1,r2,...,rn},其相应的关键字分别为{k1,k2,...,kn}\{k1,k2,...,kn\}{k1,k2,...,kn},需确定1,2,…,n的一种排列p1,p2...

2019-01-28 22:25:59 181 1

原创 大话数据结构 02 查找

定义定义描述查找表(Search Table)由同一类型的数据元素(或记录)构成的集合。关键字(Key)数据元素中某个数据项的值,标识一个数据元素。主关键字(Pramary Key)此关键字可以唯一标识一个记录。所在的数据项为主关键码。次关键字(Secondary Key)可以标识多个记录的关键字。所在的数据项为次关键码。查找(Serching...

2019-01-28 13:40:36 114

原创 剑指Offer 17 合并两个排序的链表

题目输入两个递增排序的链表,合并这两个链表并使得新链表中的结点仍然按照递增排序。思路非递归方式需要一个存储合并链表的头结点mergeHead和一个存储合并链表的结点mergeCurrent;初始化:判断两个链表head1和head2哪个小,小的作为mergeHead,同时将小的那一方head指向head.next;mergeHead指向前一个加入链表的元素,即mergeHead;循环...

2019-01-24 21:58:12 107

原创 剑指Offer 16 反转链表

题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路类似于数学归纳法:第i个结点以前的i-1个结点已经满足条件了,i-1这个节点用preNode来指代,i结点用currentNode指代,此时如果将currentNode.next直接指向preNode,则后面的链表就断了,因此要用一个结点nextNode来存储结点以防止链表断了。初始化:currentNode...

2019-01-24 16:48:30 89

原创 剑指Offer 15 链表中倒数第k个结点

题目输入一个链表,输出该链表中倒数第k个结点。(链表从1开始计数。)思路两个指针a和b,a指向第一个,b先指向第k个;ab同时移动,直到b指向链表的尾部;注意边界条件:输入链表为null,K&lt;=0,K大于链表的长度。代码public static ListNode findKthToTail(ListNode head){ if(head == null||k&lt;=0...

2019-01-24 16:18:46 72

原创 剑指Offer 14 调整数组顺序使奇数位于偶数前面

题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部。思路两个指针a和b,a指向第一个数字,b指向最后一个数字;a向后移动直到指向一个偶数,b向前移动直到指向一个奇数,交换两数;直到a和b指向同一个数。代码 public static void reorder(int[] array){ if...

2019-01-24 16:06:15 67

原创 计算机网络 01 TCP/UDP

简单了解定义描述TCP只有在确认通信对端存在时才会发送数据,实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制,提供可靠的通信传输。UDP(User Datagram Protocol)将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制,用于让广播和细节控制交给应用的通信传输。端口号程序地址,识别在...

2019-01-22 21:13:14 78

原创 大话数据结构 01 赫夫曼树

定义定义描述路径长度从树中一个结点到另一个结点之间的分支构成两个结点之间的路径。路径上的分支数目称为路径长度。树的路径长度从树根到每一结点的路径长度之和。(注意是这里是到每个结点,带权路径长度是到叶子结点)结点的带权路径长度从该结点到树根之间的路径长度和结点上权的乘积。树的带权路径长度树中所有叶子结点的带权路径长度之和。赫夫曼树带权路径长度W...

2019-01-21 13:11:01 170 2

原创 剑指Offer 13 在O(1)时间删除链表结点

题目给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。分析如果按照顺序查找,时间复杂度为O(n);把后一节点的内容复制到该结点,该结点指向下下结点;删除结点位于尾部时,需要遍历得到该结点的前一结点。链表只有一个结点。代码public class DeleteNode { class Node{ public int data; ...

2019-01-14 21:23:39 99

原创 剑指Offer 12 打印1到最大的n位数

题目输入数字n,按顺序打印从1最大的n位十进制数。分析考虑大数问题;在字符串上模拟数字加法的解法;终止条件是第一个字符产生了进位,以此快速判断是否结束,而不是比较两个字符串;输出时注意去掉补位用的0;或者把问题转换成数字排列问题,采用递归。数字的每一位都可能是0-9中的一位数,然后设置下一位。踩了个坑Java中的for each不具备赋值作用,只能遍历,相当于赋值给了一个临时...

2019-01-14 21:12:55 162

原创 剑指Offer 11 数值的整数次方

题目实现函数 double power(dower base, int exponent),求base的exponent次方。分析指数可能是负数;base可能是0;不可忽视的细节,判断底数是否等于0时,由于精度丢失问题,不可以直接写base==0。采用递归减少循环次数。采用全局变量标识出错误。代码public class Power { public static b...

2019-01-14 20:56:06 148

原创 剑指Offer10 二进制中1的个数

题目输入一个整数,输出二进制表示中1的个数。负数采用的是补码形式。分析采用移位代替除法。输入负数时要避免进入死循环。代码public class NumberOf1 { public static int number(int num){ int count=0; for(int i=0;i&amp;lt;32;i++){ ...

2019-01-14 20:46:42 89

原创 Learning JVM 09 线程安全

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 --《Java Concurrency In Practice》共享数据的5种分类可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程...

2019-01-13 15:44:08 79

原创 Learning JVM 08 内存模型和线程

什么是内存模型Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型规定:所有的变量都存储在主内存中;工作内存中保存被该线程使用到的变量的主内存拷贝副本;线程不能直接读写主内存变量;不同线程无法访问对方工作内存中的变量。...

2019-01-12 14:55:42 99

原创 MD5加密与盐值

MD5(Message-Digest Algorithm 5)是让大容量信息在用数字签名软件签署私人密匙前被&quot;压缩&quot;成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。package com.mmall.util;import org.springframework.util.StringUtils;import java.security.MessageDigest;...

2018-12-19 15:47:47 2571 1

原创 Learning JVM 07 类加载器

虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为类加载器。1.类与类加载器比较两个类是否“相等”,只有在这两个类是由同一个类加载器的前提下才有意义,否则,即使这两个类来源于同一个Class文件,只要加载它们的类加载器不同,这两个类就必定不相等。pa...

2018-12-17 11:53:58 83

原创 剑指Offer 09 斐波那契数列

递归虽然有简洁的优点,但它同时也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都要在内存栈中分配空间以保存参数、返回地址及临时变量。而且往栈里压入数据和弹出数据都需要时间。题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n&amp;amp;lt;=39思路:采用递归会有大量的重复运算,所以采用循环...

2018-12-15 17:36:19 116

原创 剑指Offer 08 旋转数组的最小数字

查找包括顺序查找、二分查找、哈希表查找、二叉排序树查找。排序包括插入排序、冒泡排序、归并排序、快速排序。考虑额外空间消耗、平均时间复杂度、最差时间复杂度。如果面试题是要求在排序的数组中查找一个数字或者统计某个数字出现的次数,都可以尝试二分查找算法。哈希表...

2018-12-15 17:10:26 79

空空如也

空空如也

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

TA关注的人

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