- 博客(11)
- 收藏
- 关注
原创 堆排序Java实现
import java.util.Arrays;public class HeapSort { /*** * 下滤调整堆(大顶堆) * 以p为根的数不是大顶堆,但是p节点的左子树和右子树均为大顶堆 * 所以只需将p节点向下交换到合适的位置 ***/ public static void adjustHeap(int[] arr, int p, int heapEnd
2018-01-20 16:50:22
191
原创 剑-数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解法:建立一个大顶堆和一个小顶堆,确保大顶堆的数都比小顶堆小。且大顶堆的数量总是等于小顶堆或者比小顶堆多一个。如果两堆数量相同,则中位数为两个堆顶之和除以二如果大顶堆比小顶堆数量多一,则中位数为大顶堆顶。/
2018-01-18 12:59:10
174
原创 剑-二叉树序列化与反序列化(三种解法)
假设有一个二叉树 _30_ / \ 10 20 / / \50 45 35解法一:前序遍历二叉树,空节点处插入#。如图 _30_ / \ 10 20 / \ / \50 # 45 35/\ /\ /\ # # # # # #序列为:30,10,50,#,#,#,20
2018-01-17 21:12:43
314
原创 剑-链表环中的入口节点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。1. 判断是否为环形链表:设置一快一慢连个节点,慢的一次走一个节点,快的一次走2各节点。若为环形,则快节点能追赶上慢节点,记此节点为meetNode。2. 计算环内节点数:meetNode一定在环形内,以它为起点遍历一圈,得到换内节点数量,记为n。3. 找的入口节点:设置node1,node2节点同时从头结点出发,node2先
2018-01-16 20:31:11
184
原创 剑-正则表达式匹配(递归 + 动态规划)
题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。递归解法public static boolean isMatc
2018-01-16 15:11:42
790
1
原创 Java并发编程:阻塞队列(Blocking Queues)、线程池(Thread Pools)的原理与代码实现
阻塞队列(Blocking Queues)当线程尝试从空队列获取元素时会被阻塞,直到其他线程插入元素。当线程尝试向满队列添加元素时会被阻塞,直到其他线程取出元素。public class BlockingQueue { //用队列结构存储元素 private Queue queue = new LinkedList<>(); private int limit = 10
2018-01-13 17:26:26
293
原创 Java并发编程:重入锁(ReentranceLock )、读写锁(ReadWriteLock)代码实现
重入锁:同一时刻只能有一条线程拥有重入锁,但此线程可以重复获得锁。其余需求获得此锁的线程被阻塞。代码实现关键是记录当前获得锁的线程。public class ReentranceLock { //记录当前获得锁的线程。 private Thread lockedBy = null; private boolean isLocked = false; private in
2018-01-13 17:03:26
2216
原创 Java并发内存模型
Java并发内存模型的主要目标是定义程序中各个变量的访问规则,即虚拟机将变量存储到内存和从内存中取出的底层细节。此处的变量指的是实例字段、静态字段和构成数组的对象元素等线程公有的资源。因为只有这些被线程共享,存在竞争问题。如下是内存模型概念图:主内存 : 所有的变量都存储在主内存中, 为线程共享,通过Save和Load操作与工作内存交互。工作内存 : 每条线程都有自己的工作内存
2018-01-12 13:17:16
224
原创 Java线程状态转换
线程转换图Thread.sleep(long millis) : 使当前线程阻塞规定的时间,不失去占有的锁。阻塞结束后转入可运行状态。Thread.yield() : 使当前线程转入可运行状态,不是去占有锁。与sleep相比,不会被阻塞规定时间。Thread.interrupt(): 设置中断标志为True,当此线程进入阻塞状态时,会抛出interrupted异常。通过捕捉in
2018-01-12 12:35:57
177
原创 JVM垃圾收集器
主要讨论针对于Java堆的垃圾回收如何判断对象需要回收1. 引用计数法给对象添加一个计数器,每当有一个地方引用它,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能在被使用的。但这种方法很难解决对象之间的相互循环引用问题,如下代码所示:public class DemoClass { public Object instance = null
2018-01-11 15:34:26
154
原创 Java虚拟机内存区域
1. Java虚拟机包含以下几个运行时数据区域,如下图所示程序计数器:- 线程私有内存, 可以看作是当前线程所执行的字节码的符号指示器。- 在虚拟机概念模型里,字节码解释器工作时就是通过这个计数器的值来选取下一条需要执行的字节码指令。- 此区域在虚拟机规范中没有规定OutOfMemoryError情况。虚拟机栈: - 线程私有内存,描述Java方
2018-01-11 15:27:39
142
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人