705.设计哈希集合
不使用任何内建的哈希表库设计一个哈希集合
具体地说,你的设计应该包含以下的功能
- 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:用时比较慢,但代码是基础
class MyHashSet {
class Node {
public int key;
public Node next;
public Node(int key) {
this.key = key;
}
}
private Node[] array;
private int usedSize;
/** Initialize your data structure here. */
public MyHashSet() {
this.array = new Node[10];
this.usedSize = 0;
}
public void add(int key) {
// 1. 得到key对应的唯一的hashCode()所得到的下标
int index = key % array.length;
//2.遍历数组中index下表位置所对应的桶
for(Node cur = array[index]; cur != null; cur = cur.next) {
if(cur.key == key) {
return;
}
}
//3.循环结束,桶中不存在此元素,进行尾插法法如桶中
Node node = new Node(key);
node.next = array[index];
array[index] = node;
this.usedSize++;
}
public void remove(int key) {
int index = key % array.length;
if(array[index] == null) {
return;
}
Node cur = array[index];
// 要删除的值是改桶的头结点
if(cur.key == key) {
array[index] = cur.next;
this.usedSize--;
return;
}
while(cur.next != null) {
if(cur.next.key == key) {
cur.next = cur.next.next;
this.usedSize--;
return;
}
cur = cur.next;
}
}
/** Returns true if this set contains the specified element */
public boolean contains(int key) {
int index = key % array.length;
for(Node cur = array[index]; cur != null; cur = cur.next) {
if(cur.key == key) {
return true;
}
}
return false;
}
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet obj = new MyHashSet();
* obj.add(key);
* obj.remove(key);
* boolean param_3 = obj.contains(key);
*/
方法2:也可以直接new一个boolean类型的数组
用时比较快
class MyHashSet {
private boolean[] hashSet;
/** Initialize your data structure here. */
public MyHashSet() {
hashSet = new boolean[1000001];
}
public void add(int key) {
hashSet[key] = true;
}
public void remove(int key) {
hashSet[key] = false;
}
/** Returns true if this set contains the specified element */
public boolean contains(int key) {
return hashSet[key];
}
}
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet obj = new MyHashSet();
* obj.add(key);
* obj.remove(key);
* boolean param_3 = obj.contains(key);
*/