Skip to content

Commit e45ec2e

Browse files
committed
JAVA 知识体系
1 parent 2e8d719 commit e45ec2e

File tree

5 files changed

+148
-17
lines changed

5 files changed

+148
-17
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
- [画一个线程的生命周期状态图。](https://blog.csdn.net/houbin0912/article/details/77969563)
101101
- sleep和wait的区别。
102102
- sleep和sleep(0)的区别。
103+
- [Java 各种锁的小结](https://mp.weixin.qq.com/s/_xazrXa8MBYaz2WaX6BNew)
103104
- [Lock与Synchronized的区别 。](https://blog.csdn.net/javazejian/article/details/75043422)
104105
- [synchronized的原理是什么](https://blog.csdn.net/javazejian/article/details/72828483)
105106
- [量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。](https://www.toutiao.com/i6630764198357893646/)

src/main/java/com/algorithm/study/demo/datastructure/heap/TopkCount.java

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class TopkCount {
1717
* @param k
1818
* @return
1919
*/
20-
public static int[] topk(int[] data, int k) {
20+
public static int topk(int[] data, int k) {
2121
PriorityQueue<Integer> queue = new PriorityQueue<>(k);
2222

2323
for (int i = 0; i < data.length; i++) {
@@ -32,18 +32,69 @@ public static int[] topk(int[] data, int k) {
3232
}
3333
}
3434
}
35+
return queue.peek();
36+
}
37+
38+
/**
39+
* 手动实现堆然后查找topK
40+
* @param nums
41+
* @param k
42+
* @return
43+
*/
44+
public static int findKthLargest(int[] nums, int k) {
45+
//构建一个小顶堆数组
46+
int[] out = new int[k];
47+
//小顶堆元素数量
48+
int count = 0;
49+
//循环处理数组
50+
for (int i=0;i<nums.length;i++){
51+
//数组没有满之前,从下向上调整
52+
if(count<k){
53+
out[i] = nums[i];
54+
count++;
55+
down2up(out,i);
56+
}else{
57+
//数组满了以后,如果新元素大于堆顶则替换堆顶,然后从上向下调整
58+
if(nums[i]>out[0]){
59+
out[0] = nums[i];
60+
up2down(out,0);
61+
}
62+
}
63+
}
64+
return out[0];
65+
}
3566

36-
int[] result = new int[k];
37-
int index = 0;
38-
// 遍历完成后,小顶堆的数据就为需要求得的topk的数据
39-
while (!queue.isEmpty()) {
40-
result[index++] = queue.poll();
67+
//从下向上调整,构建小顶堆
68+
public static void down2up(int[] nums,int i){
69+
int parent = (i-1)/2;
70+
while(parent>=0&&nums[i]<nums[parent]){
71+
swap(nums,i,parent);
72+
i = parent;
73+
parent = (i-1)/2;
4174
}
75+
}
76+
77+
//从上向下调整,构建小顶堆
78+
public static void up2down(int[] nums,int p){
79+
while(true){
80+
int left = 2*p+1;
81+
int right = 2*p+2;
82+
int minpos = p;
83+
if(left<nums.length&&nums[left]<nums[p]) minpos=left;
84+
if(right<nums.length&&nums[right]<nums[minpos]) minpos=right;
85+
if(minpos==p) break;
86+
swap(nums,p,minpos);
87+
p = minpos;
88+
}
89+
}
4290

43-
return result;
91+
private static void swap(int[] nums, int i, int parent) {
92+
int tmp = nums[i];
93+
nums[i] = nums[parent];
94+
nums[parent] = tmp;
4495
}
4596

4697
public static void main(String[] args) {
47-
System.out.println(JSON.toJSONString(topk(new int[]{1,2,3,4,5},2)));
98+
System.out.println(findKthLargest(new int[]{1,2,3,4,5},2));
4899
}
49100
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.algorithm.study.demo.datastructure.linear;
2+
3+
/**
4+
* 链表数据结构
5+
* @Author: liuxun
6+
* @CreateDate: 2019/2/12 下午3:43
7+
* @Version: 1.0
8+
*/
9+
public class ListNode {
10+
int val;
11+
ListNode next;
12+
public ListNode(int val){
13+
this.val=val;
14+
}
15+
}

src/main/java/com/algorithm/study/demo/datastructure/linear/MLinkList.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313
public class MLinkList<E> {
1414
// 定义一个内部类Node,代表链表的节点
15-
private class Node {
15+
public class Node {
1616
private E value;// 保存数据
1717
private Node next;// 指向下个节点的引用
1818

@@ -214,17 +214,17 @@ public void reverseLinkedList(){
214214
System.out.println("反转完毕");
215215
}
216216

217-
218217
public static void main(String[] args) {
219-
MLinkList mLinkList=new MLinkList();
220-
mLinkList.add("a");
221-
mLinkList.add("b");
222-
mLinkList.add("c");
223-
mLinkList.add("d");
218+
MLinkList<Integer> mLinkList=new MLinkList();
219+
mLinkList.add(4);
220+
mLinkList.add(1);
221+
mLinkList.add(8);
222+
mLinkList.add(4);
223+
mLinkList.add(5);
224224
// System.out.println(mLinkList.toString());
225225
// mLinkList.delete("b");
226-
mLinkList.delete(0);
227-
System.out.println(mLinkList.size);
226+
// mLinkList.delete(0);
227+
// System.out.println(mLinkList.size);
228228
// mLinkList.reverseLinkedList();
229229
System.out.println(mLinkList.toString());
230230

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.algorithm.study.demo.datastructure.linear;
2+
3+
import org.omg.PortableInterceptor.INACTIVE;
4+
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
/**
10+
* @Author: liuxun
11+
* @CreateDate: 2019/2/12 下午3:43
12+
* @Version: 1.0
13+
*/
14+
public class Solution {
15+
public static ListNode detectCycle(ListNode head) {
16+
ListNode temp=head;
17+
ListNode temp2=head;
18+
while(temp!=null && temp.next.next!=null){
19+
temp2=temp2.next.next;
20+
temp=temp.next;
21+
if (temp==temp2){
22+
ListNode q = head;
23+
while(temp2!=q){
24+
temp2=temp2.next;
25+
q=q.next;
26+
}
27+
return q;
28+
}
29+
}
30+
return null;
31+
}
32+
33+
public static void main(String[] args) {
34+
ListNode head=new ListNode(3);
35+
ListNode head0=new ListNode(1);
36+
37+
ListNode head1=new ListNode(2);
38+
ListNode head2=new ListNode(-4);
39+
40+
head.next=head0;
41+
head0.next=head1;
42+
head1.next=head2;
43+
head2.next=head1;
44+
// head1.next=head2;
45+
// head2.next=head3;
46+
// head3.next=head1;
47+
ListNode c=Solution.detectCycle(head);
48+
System.out.println(c==null?-1:1);
49+
50+
51+
}
52+
public boolean containsDuplicate(int[] nums) {
53+
if(nums==null || nums.length<2){
54+
return false;
55+
}
56+
Arrays.sort(nums);
57+
for(int i=0;i<nums.length-1;i++){
58+
if (nums[i]==nums[i+1]){
59+
return true;
60+
}
61+
}
62+
return false;
63+
}
64+
}

0 commit comments

Comments
 (0)