1.归并两个有序链表(归并排序)
2.最小路径和--BP解法
3.计算int sqrt(x)--二分解法
4.趣味面试题
5.跳步游戏(Jump_Game)--后向回溯算法
7.零点根问题--牛顿迭代算法(同问题3)
8.众数--众数投票算法(Boyer-Moore Algorithm)
9.康威生命游戏--解法(位运算)
10.蓄水池抽样--蓄水池(Reservoir_sampling)抽样算法简记
11.数根问题
12.杨辉三角 -- 组合数
14.矩阵查找(Search_a_2D_Matrix_II)--二分查找
15.荷兰国旗(Sort_Colors)--快速排序
16.找出出现一次的数(SingleNumber_II/SingleNumber_lll)--位运算
17.无遮盖的区段(Non_overlapping_Intervals)--贪心算法
18.根据身高构建队列(Queue_Reconstruction_by_Height)--贪心算法
19.英文提取词干(Replace_Words)--Trie树
21.最小高度树(Minimum_Height_Trees)--图
按算法和数据结构归类:
排序与查找:1.归并两个有序链表(归并排序) 14.矩阵查找(Search_a_2D_Matrix_II)--二分查找 15.荷兰国旗(Sort_Colors)--快速排序
位运算:6.Excel列号转十进制--碾转相除法 9.康威生命游戏--解法(位运算) 13.SingleNumber -- 位运算保留不同的元素 16.找出出现一次的数(SingleNumber_II/SingleNumber_lll)--位运算
贪心算法:4.趣味面试题 17.无遮盖的区段(Non_overlapping_Intervals)--贪心算法 18.根据身高构建队列(Queue_Reconstruction_by_Height)--贪心算法
并查集:
字典树:19.英文提取词干(Replace_Words)--Trie树 20.构造一个Trie树(Trie)--Trie树
图:21.最小高度树(Minimum_Height_Trees)--图
JAVA中HashMap实现:
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
1 /** 2 * The table, resized as necessary. Length MUST Always be a power of two. 3 */ 4 transient Entry[] table; 5 6 static class Entry<K,V> implements Map.Entry<K,V> { 7 final K key; 8 V value; 9 Entry<K,V> next; 10 final int hash; 11 …… 12 }
HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
HashMap的put方法:
1 static int hash(int h) { 2 h ^= (h >>> 20) ^ (h >>> 12); 3 return h ^ (h >>> 7) ^ (h >>> 4); 4 } 5 6 static int indexFor(int h, int length) { 7 return h & (length-1); 8 } 9 10 public V put(K key, V value) { 11 // HashMap允许存放null键和null值。 12 // 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。 13 if (key == null) 14 return putForNullKey(value); 15 // 根据key的keyCode重新计算hash值。 16 int hash = hash(key.hashCode()); 17 // 搜索指定hash值在对应table中的索引。 18 int i = indexFor(hash, table.length); 19 // 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素。 20 for (Entry<K,V> e = table[i]; e != null; e = e.next) { 21 Object k; 22 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 23 V oldValue = e.value; 24 e.value = value; 25 e.recordAccess(this); 26 return oldValue; 27 } 28 } 29 // 如果i索引处的Entry为null,表明此处还没有Entry。 30 modCount++; 31 // 将key、value添加到i索引处。 32 addEntry(hash, key, value, i); 33 return null; 34 }
HashMap的get方法:
1 public V get(Object key) { 2 if (key == null) 3 return getForNullKey(); 4 int hash = hash(key.hashCode()); 5 for (Entry<K,V> e = table[indexFor(hash, table.length)]; 6 e != null; 7 e = e.next) { 8 Object k; 9 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 10 return e.value; 11 } 12 return null; 13 }