File tree Expand file tree Collapse file tree 8 files changed +351
-12
lines changed
delei-interview-algorithm/src/main/java/cn/delei/algorithm
delei-interview-java-core/src/main/java/cn/delei/java Expand file tree Collapse file tree 8 files changed +351
-12
lines changed Original file line number Diff line number Diff line change
1
+ package cn .delei .algorithm .lru ;
2
+
3
+ import java .util .HashMap ;
4
+ import java .util .LinkedList ;
5
+ import java .util .Map ;
6
+
7
+ /**
8
+ * LRU实现:LinkedList+HashMap
9
+ *
10
+ * @param <K> 键
11
+ * @param <V> 键值
12
+ * @author deleiguo
13
+ */
14
+ public class LRUCache <K , V > {
15
+ int capacity ;
16
+ Map <K , V > map ;
17
+ LinkedList <K > list ;
18
+
19
+ public LRUCache (int capacity ) {
20
+ this .capacity = capacity ;
21
+ this .map = new HashMap <>();
22
+ this .list = new LinkedList <>();
23
+ }
24
+
25
+ /**
26
+ * 添加元素
27
+ * 1.元素存在,放到队尾
28
+ * 2.不存在,判断链表是否满。
29
+ * 如果满,则删除队首元素,放入队尾元素,删除更新哈希表
30
+ * 如果不满,放入队尾元素,更新哈希表
31
+ */
32
+ public void put (K key , V value ) {
33
+ V v = map .get (key );
34
+ if (v != null ) {
35
+ list .remove (key );
36
+ list .addLast (key );
37
+ map .put (key , value );
38
+ return ;
39
+ }
40
+
41
+ //队列未满,添加到尾部
42
+ if (list .size () < capacity ) {
43
+ list .addLast (key );
44
+ map .put (key , value );
45
+ } else {
46
+ //队列已满,移除队首
47
+ K firstKey = list .removeFirst ();
48
+ map .remove (firstKey );
49
+ list .addLast (key );
50
+ map .put (key , value );
51
+ }
52
+ }
53
+
54
+ /**
55
+ * 访问元素
56
+ * 元素存在,放到队尾
57
+ */
58
+ public V get (K key ) {
59
+ V v = map .get (key );
60
+ if (v != null ) {
61
+ list .remove (key );
62
+ list .addLast (key );
63
+ return v ;
64
+ }
65
+ return null ;
66
+ }
67
+ }
Original file line number Diff line number Diff line change
1
+ package cn .delei .algorithm .lru ;
2
+
3
+ import java .util .LinkedHashMap ;
4
+ import java .util .Map ;
5
+
6
+ /**
7
+ * LRU实现:LinkedHashMap
8
+ *
9
+ * @param <K> 键
10
+ * @param <V> 键值
11
+ * @author deleiguo
12
+ */
13
+ public class LRULinkedHashMap <K , V > extends LinkedHashMap <K , V > {
14
+ private static final long serialVersionUID = -3788497546136920185L ;
15
+
16
+ /**
17
+ * 容量
18
+ */
19
+ private final int capacity ;
20
+
21
+ LRULinkedHashMap (int capacity ) {
22
+ // 初始大小,0.75是装载因子,true是表示按照访问时间排序,最近访问的放在头部,最老访问的放在尾部
23
+ super (capacity , 0.75f , true );
24
+ // 指定最大容量
25
+ this .capacity = capacity ;
26
+ }
27
+
28
+ /**
29
+ * 核心实现
30
+ */
31
+ @ Override
32
+ protected boolean removeEldestEntry (Map .Entry <K , V > eldest ) {
33
+ // 如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素,即最老的数据
34
+ return size () > capacity ;
35
+ }
36
+
37
+ }
Original file line number Diff line number Diff line change
1
+ package cn .delei .algorithm .lru ;
2
+
3
+ import java .util .concurrent .locks .Lock ;
4
+ import java .util .concurrent .locks .ReentrantLock ;
5
+
6
+ /**
7
+ * 带有 Lock 操作
8
+ *
9
+ * @param <K> 键
10
+ * @param <V> 键值
11
+ * @author deleiguo
12
+ */
13
+ public class LRULinkedHashMapWithLock <K , V > extends LRULinkedHashMap <K , V > {
14
+ private static final long serialVersionUID = -480172344142509767L ;
15
+
16
+ private final Lock lock = new ReentrantLock ();
17
+
18
+ LRULinkedHashMapWithLock (int capacity ) {
19
+ super (capacity );
20
+ }
21
+
22
+ @ Override
23
+ public boolean containsValue (Object value ) {
24
+ lock .lock ();
25
+ try {
26
+ return super .containsValue (value );
27
+ } finally {
28
+ lock .unlock ();
29
+ }
30
+ }
31
+
32
+ @ Override
33
+ public V get (Object key ) {
34
+ lock .lock ();
35
+ try {
36
+ return super .get (key );
37
+ } finally {
38
+ lock .unlock ();
39
+ }
40
+ }
41
+
42
+ @ Override
43
+ public V put (K key , V value ) {
44
+ lock .lock ();
45
+ try {
46
+ return super .put (key , value );
47
+ } finally {
48
+ lock .unlock ();
49
+ }
50
+ }
51
+
52
+ @ Override
53
+ public int size () {
54
+ lock .lock ();
55
+ try {
56
+ return super .size ();
57
+ } finally {
58
+ lock .unlock ();
59
+ }
60
+ }
61
+
62
+ @ Override
63
+ public void clear () {
64
+ lock .lock ();
65
+ try {
66
+ super .clear ();
67
+ } finally {
68
+ lock .unlock ();
69
+ }
70
+ }
71
+
72
+ @ Override
73
+ public boolean containsKey (Object key ) {
74
+ lock .lock ();
75
+ try {
76
+ return super .containsKey (key );
77
+ } finally {
78
+ lock .unlock ();
79
+ }
80
+ }
81
+ }
Original file line number Diff line number Diff line change
1
+ package cn .delei .algorithm .lru ;
2
+
3
+ /**
4
+ * LRU 测试
5
+ */
6
+ public class LRUTest {
7
+
8
+ public static void main (String [] args ) {
9
+ linkedHashMapTest ();
10
+ }
11
+
12
+ private static void linkedHashMapTest () {
13
+ LRULinkedHashMap <Integer , String > lru = new LRULinkedHashMap <>(5 );
14
+ for (int i = 0 ; i < 10 ; i ++) {
15
+ lru .put (i , i + "i" );
16
+ }
17
+ System .out .println (lru .toString ());
18
+ }
19
+ }
Original file line number Diff line number Diff line change 1
1
package cn .delei .algorithm .sort ;
2
2
3
+ import cn .delei .algorithm .SwapNumber ;
4
+
3
5
import java .util .Arrays ;
4
6
5
7
/**
@@ -18,9 +20,7 @@ public int[] sort(int[] data) {
18
20
flag = true ;
19
21
for (int j = 0 ; j < arr .length - i ; j ++) {
20
22
if (arr [j ] > arr [j + 1 ]) {
21
- int tmp = arr [j ];
22
- arr [j ] = arr [j + 1 ];
23
- arr [j + 1 ] = tmp ;
23
+ SwapNumber .swapByTemp (arr , j , j + 1 );
24
24
flag = false ;
25
25
}
26
26
}
Original file line number Diff line number Diff line change 10
10
public class InsertSort implements IArraySort {
11
11
@ Override
12
12
public int [] sort (int [] data ) {
13
+ if (data .length < 2 ) {
14
+ return data ;
15
+ }
13
16
// 对 arr 进行拷贝,不改变参数内容
14
17
int [] arr = Arrays .copyOf (data , data .length );
15
18
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
16
19
int temp , j ;
20
+ // i从1开始
17
21
for (int i = 1 ; i < arr .length ; i ++) {
18
22
// 记录要插入的数据
19
23
temp = arr [i ];
20
24
// 从已经排序的序列最右边的开始比较,找到比其小的数
21
- j = i ;
22
- while (j > 0 && temp < arr [j - 1 ]) {
23
- arr [j ] = arr [j - 1 ];
24
- j --;
25
- }
26
- // 存在比其小的数,插入
27
- if (j != i ) {
28
- arr [j ] = temp ;
25
+ j = i - 1 ;
26
+ // 查找插入的位置
27
+ for (; j >= 0 ; --j ) {
28
+ if (arr [j ] > temp ) {
29
+ // 数据移动
30
+ arr [j + 1 ] = arr [j ];
31
+ } else {
32
+ break ;
33
+ }
29
34
}
35
+ // 插入数据
36
+ arr [j + 1 ] = temp ;
30
37
}
31
38
return arr ;
32
39
}
Original file line number Diff line number Diff line change @@ -14,7 +14,7 @@ public class SelectionSort implements IArraySort {
14
14
public int [] sort (int [] data ) {
15
15
int [] arr = Arrays .copyOf (data , data .length );
16
16
// 总共要经过 N-1 轮比较
17
- int min , temp ;
17
+ int min ;
18
18
for (int i = 0 ; i < arr .length - 1 ; i ++) {
19
19
min = i ;
20
20
// 每轮需要比较的次数 N-i
You can’t perform that action at this time.
0 commit comments