2019.11.10 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
github:https://github.com/ChopinXBP/LeetCode-Babel
数据结构题,应知应会。
HashSet可以用二维数组进行动态开辟空间,避免直接开辟过大的一维数组造成资源浪费。
HashMap容量初始为16,需要考虑负载,一旦数量-容量比大于负载系数(0.75),进行再散列,将容量扩大为原来的两倍(保持2的幂次)。
在2的幂次的容量的情况下,哈希值计算有:
key & (length - 1) == key % length
补充:
java中HashSet底层其实是HashMap,HashSet的add方法底层调用HashMap的put方法,添加的value是一个固定的Object对象常量PRESENT。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
Design a HashSet without using any built-in hash table libraries.
To be specific, your design should include these functions:
add(value): Insert a value into the HashSet.
contains(value) : Return whether the value exists in the HashSet or not.
remove(value): Remove a value in the HashSet. If the value does not exist in the HashSet, do nothing.
不使用任何内建的哈希表库设计一个哈希集合
具体地说,你的设计应该包含以下的功能
add(value):向哈希集合中插入一个值。
contains(value) :返回哈希集合中是否存在这个值。
remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
示例:
MyHashSet hashSet = new MyHashSet();
hashSet.add(1);
hashSet.add(2);
hashSet.contains(1); // 返回 true
hashSet.contains(3); // 返回 false (未找到)
hashSet.add(2);
hashSet.contains(2); // 返回 true
hashSet.remove(2);
hashSet.contains(2); // 返回 false (已经被删除)
注意:
所有的值都在 [1, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希集合库。
/**
*
* Design a HashSet without using any built-in hash table libraries.
* 不使用任何内建的哈希表库设计一个哈希集合
*
*/
public class DesignHashSet {
class MyHashSet {
private int buckets = 1000;
private int itemsPerBucket = 1001;
private boolean[][] table;
/** Initialize your data structure here. */
public MyHashSet() {
table = new boolean[buckets][];
}
//计算哈希值(商对应桶组)
public int hash(int key){
return key / buckets;
}
//计算位置(余数对应桶号)
public int pos(int key){
return key % buckets;
}