diff --git a/0816_design-hashset/README.md b/0816_design-hashset/README.md new file mode 100644 index 0000000..bf70e82 --- /dev/null +++ b/0816_design-hashset/README.md @@ -0,0 +1,31 @@ +Design a HashSet without using any built-in hash table libraries. + +Implement `MyHashSet` class: + +* `void add(key)` Inserts the value `key` into the HashSet. +* `bool contains(key)` Returns whether the value `key` exists in the HashSet or not. +* `void remove(key)` Removes the value `key` in the HashSet. If `key` does not exist in the HashSet, do nothing. + +**Example 1:** + + Input + ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"] + [[], [1], [2], [1], [3], [2], [2], [2], [2]] + Output + [null, null, null, true, false, null, true, null, false] + + Explanation + MyHashSet myHashSet = new MyHashSet(); + myHashSet.add(1); // set = [1] + myHashSet.add(2); // set = [1, 2] + myHashSet.contains(1); // return True + myHashSet.contains(3); // return False, (not found) + myHashSet.add(2); // set = [1, 2] + myHashSet.contains(2); // return True + myHashSet.remove(2); // set = [1] + myHashSet.contains(2); // return False, (already removed) + +**Constraints:** + +* `0 <= key <= 106` +* At most `104` calls will be made to `add`, `remove`, and `contains`. \ No newline at end of file diff --git a/0816_design-hashset/python3/solution.py b/0816_design-hashset/python3/solution.py new file mode 100644 index 0000000..8691581 --- /dev/null +++ b/0816_design-hashset/python3/solution.py @@ -0,0 +1,48 @@ +from collections import deque + +class MyHashSet: + + def __init__(self): + self.hashDivisor = 769 # Pick a prime number to avoid collisions + self.buckets = [Bucket() for _ in range(self.hashDivisor)] + + + def add(self, key: int) -> None: + hash = self.hash(key) + self.buckets[hash].add(key) + + def remove(self, key: int) -> None: + hash = self.hash(key) + self.buckets[hash].remove(key) + + def contains(self, key: int) -> bool: + hash = self.hash(key) + return self.buckets[hash].contains(key) + + def hash(self, key: int) -> int: + return key % self.hashDivisor + +class Bucket: + def __init__(self): + self.d = deque() + pass + + def add(self, key: int) -> None: + if key not in self.d: + self.d.append(key) + + def remove(self, key: int) -> None: + try: + self.d.remove(key) + except: + pass + + def contains(self, key: int) -> None: + return key in self.d + + +# Your MyHashSet object will be instantiated and called as such: +# obj = MyHashSet() +# obj.add(key) +# obj.remove(key) +# param_3 = obj.contains(key) \ No newline at end of file