- 博客(131)
- 收藏
- 关注
原创 [剑指offer] 斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路公式:f(n) = n, n <= 1f(n) = f(n-1) + f(n-2), n > 1可以直接使用递归的方法:if(n<=1) return n;else return Fibonacci(n-1)+Fibonacci(...
2019-04-24 10:24:01
251
原创 二、Git之仓库与多人协助
一、远程仓库在了解之前,先注册github账号,由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置:第一步:创建SSHKey。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:ssh-keygen -t rsa –C ...
2019-04-23 17:12:32
1006
原创 一、Git之基本操作
一、Git是什么?Git是目前世界上最先进的分布式版本控制系统。二、SVN与Git的最主要的区别?SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的...
2019-04-23 14:39:34
283
原创 [剑指offer] 复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路参考代码/*public class RandomListNode { int label; RandomListNode next = nu...
2019-04-23 09:18:00
194
原创 [剑指offer] 两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路如果两个链表存在公共结点,那么它们从公共结点开始一直到链表的结尾都是一样的,因此我们只需要从链表的结尾开始,往前搜索,找到最后一个相同的结点即可。但是题目给出的单向链表,我们只能从前向后搜索,这时,我们就可以借助栈来完成。先把两个链表依次装到两个栈中,然后比较两个栈的栈顶结点是否相同,如果相同则出栈,如果不同,那最后相同的结点就是我们要...
2019-04-23 09:17:46
150
原创 [剑指offer] 合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路两种解法:递归和非递归参考代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*//...
2019-04-22 15:58:01
172
原创 [剑指offer] 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针刚好指向倒数第k个节点。关注要点链表头指针是否为空,若为空则直接返回回nullk是否为0,k为0也就是...
2019-04-22 15:57:10
142
原创 [剑指offer] 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2的过程中,用pre让节点反转所指方向,next节点保存next1节点防止链...
2019-04-22 15:55:58
166
原创 [剑指offer] 从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路一种方法是利用栈来实现;另外一种方法是利用三个指针把链表反转,关键是 r 指针保存断开的节点。参考代码/*** public class ListNode {* int val;* ListNode next = null;** ListNode(...
2019-04-22 15:54:58
179
原创 [剑指offer] 滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5...
2019-04-22 15:51:47
177
原创 [剑指offer] 构建乘积数组
题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。解题思路B[i]的值可以看作图中矩阵第 i 行所有元素的乘积。我们可以先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。参考代码public cla...
2019-04-22 14:41:03
210
原创 [剑指offer] 数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路最简单的就是用一个数组或者哈希表来存储已经遍历过的数字,但是这样需要开辟额外的空间。如果题目要求不能开辟额外的...
2019-04-22 14:35:21
185
原创 [剑指offer] 孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最...
2019-04-22 14:22:53
135
原创 [剑指offer] 扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子……LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5...
2019-04-22 14:15:30
133
原创 [剑指offer] 数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路法一:大家都能想到的HashMap法法二:异或法任何一个数字异或它自己都等于0。如果数组中只一个数字是只出现一次的,其他数字都是成双成对出现的,那么我们从头到尾依次异或数组中的每个数字,最终的结果刚好就是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。那么...
2019-04-22 11:06:06
140
原创 二分查找:非递归实现和递归实现
二分查找简介二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序。先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid把这个数组分为两半,前一半从下标0到mid-1,后一半从mid+1到数组最后一个元素(下标是数组长度减一)。把这个查找的元素key和数组下标为mid的元素进行比较,也就是和中间那个元素进...
2019-04-19 18:00:44
401
原创 [剑指offer] 数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题思路正常的思路就是二分查找了,我们用递归的方法实现了查找k第一次出现的下标,用循环的方法实现了查找k最后一次出现的下标。除此之外,还有另一种奇妙的思路,因为data中都是整数,所以我们不用搜索k的两个位置,而是直接搜索k-0.5和k+0.5这两个数应该插入的位置,然后相减即可。参考代码法一://普通循环查找public class S...
2019-04-19 17:56:13
152
原创 [剑指offer] 把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。参考代码public class Solution { public static String PrintMinNumber(int [] numbers) { int n; ...
2019-04-19 17:35:29
212
原创 [剑指offer] 连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度...
2019-04-19 16:10:39
139
原创 [剑指offer] 最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路两种方法:法1:先对数组排序,然后取出前k个。法2:利用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。参考代码法1:(这里我们顺便复习下手动排序,我们选择插入排序)public class Solution { p...
2019-04-19 15:40:38
155
原创 [剑指offer] 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路三种解法:法1:借助hashmap存储数组中每个数出现的次数,最后看是否有数字出现次数超过数组长度的一半;法2:排序。数组排序后,如果某个数字出现次数超过数组的长...
2019-04-19 00:20:55
166
原创 [剑指offer] 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路先得到矩阵的行和列数,然后依次旋转打印数据,一次旋转打印结束后,往对角分别前进和后退一个单位。要注意单行和单列的情况...
2019-04-19 00:20:41
107
原创 [剑指offer] 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解答import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Solution { pub...
2019-04-19 00:20:21
103
原创 [剑指Offer] 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解答:转换成普通寻找数组最小值问题public class Solution { public in...
2019-04-18 20:12:15
123
原创 [剑指Offer] 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解答一:直接循环求解public class Solution { public static boolean Find(int target, int [][] array) {...
2019-04-18 19:54:09
117
原创 八、Redis消息模式与缓存问题
八、Redis消息模式8.1、队列模式使用list类型的lpush和rpop实现消息队列注意事项消息接收方如果不知道队列中是否有消息,会一直发送rpop命令,如果这样的话,会每一次都建立一次连接,这样显然不好。可以使用brpop命令,它如果从队列中取不出来数据,会一直阻塞,在一定范围内没有取出则返回null、8.2、发布订阅模式订阅消息(subscribe)示例:sub...
2019-04-18 18:01:09
791
原创 七、Redis Cluster集群
七、Redis Cluster集群redis3.0以后推出的redis cluster 集群方案,redis cluster集群保证了高可用、高性能、高可扩展性。10.1redis-cluster架构图架构细节:(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.(3)客户端...
2019-04-18 17:48:18
234
原创 六、Redis Sentinel哨兵机制
六、Redis Sentinel哨兵机制Redis主从复制的缺点:没有办法对master进行动态选举,需要使用Sentinel机制完成动态选举9.1简介Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA)其已经被集成在redis2.6+的版本中,R...
2019-04-18 17:41:53
242
原创 五、Redis的主从复制
五、Redis的主从复制8.1什么是主从复制持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,不过通过redis的主从复制机制就可以避免这种单点故障,如下图:说明:主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服...
2019-04-18 17:34:08
155
原创 四、Redis持久化方案
四、Redis持久化方案Redis是一个内存数据库,为了保证数据的持久性,它提供了两种持久化方案:RDB方式(默认)AOF方式4.1、RDB方式RDB是Redis默认采用的持久化方式。RDB方式是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。Redis会在指定的情况下触发快照。1.符合自定义配置的快...
2019-04-18 17:14:35
183
原创 三、Redis事务和分布式锁
三、Redis事务3.1、Redis事务介绍Redis的事务是通过MULTI,EXEC,DISCARD和WATCH这四个命令来完成的。Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合。Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行。Redis不支持回滚操作。3.2、相关命令MULTI用于标记事务块的开始。Redis会将后续的...
2019-04-18 16:23:30
294
原创 二、Redis的5种数据类型
二、Redis数据类型官方命令大全网址:http://www.redis.cn/commands.htmlRedis中存储数据是通过key-value格式存储数据的,其中value可以定义五种数据类型:String(字符类型)Hash(散列类型)List(列表类型)Set(集合类型)SortedSet(有序集合类型,简称zset)注意:在redis中的命令语句中,命令是忽略大小...
2019-04-18 15:53:34
476
原创 一、Redis简介
一、Redis介绍1.1、什么是Redis?Redis是用C语言开发的一个开源的高性能键值对(key-value)内存数据库。它提供五种数据类型来存储值:字符串类型、散列类型、列表类型、集合类型、有序集合类型它是一种NoSQL数据库。1.2、什么是NoSQL?NoSQL,即Not-Only SQL(不仅仅是SQL),泛指非关系型的数据库。什么是关系型数据库?数据结构是一种有行有列的数...
2019-04-18 10:25:46
176
原创 七、深入理解JVM之线程安全
七、线程安全1、不可变:不可变的对象一定是线程安全的、无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障。例如:把对象中带有状态的变量都声明为final,这样在构造函数结束之后,它就是不可变的。2、绝对线程安全3、相对线程安全:相对的线程安全就是我们通常意义上所讲的线程安全,它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特...
2019-04-15 12:01:11
278
原创 六、深入理解JVM之Java内存模型与线程
六、Java内存模型与线程6.1内存间的交互操作关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成:lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。...
2019-04-15 11:59:55
210
原创 五、深入理解JVM之虚拟机类加载机制
五、虚拟机类加载机制虚拟机吧描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制在Java语言里面,类型的加载。连接和初始化过程都是在程序运行期间完成的5.1 类加载的时机类被加载到虚拟机内存中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段加载、验证、准备、...
2019-04-15 11:59:01
138
原创 四、深入理解JVM之垃圾收集(GC)
四、垃圾收集程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。4.1、判断对象存活4.1.1、引用计数器法给对象添加一个引用计数器,每当由一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。从图中可以看出,如果不下小心直接...
2019-04-15 11:57:42
227
原创 三、深入理解JVM之OutOfMemoryError 异常
三、OutOfMemoryError 异常3.1、Java堆溢出Java堆用于存储对象实例,只要不断的创建对象,并且保证GCRoots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在数量到达最大堆的容量限制后就会产生内存溢出异常。如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自...
2019-04-15 10:29:16
531
原创 二、深入理解JVM之虚拟机对象
二、hotspot虚拟机对象2.1、对象的创建2.1.1、检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2.1.2、分配内存接下来将为新生对象分配内存,为对象分配内存空间的任务等同于把一块确定的大小的内存从Java堆中划分出来。假设Ja...
2019-04-15 10:24:49
204
原创 一、深入理解JVM之运行时数据区域
一、运行时数据区域Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区。1.1、程序计数器程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支、循环、跳转、异常处理、线程恢复等基础功能...
2019-04-15 10:23:36
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅