디자인 해시셋
구현
MyHashSet
클래스:void add(key)
값key
을 HashSet에 삽입합니다. bool contains(key)
값key
이 HashSet에 존재하는지 여부를 반환합니다. void remove(key)
HashSet에서 값key
을 제거합니다. key
가 HashSet에 없으면 아무 작업도 수행하지 않습니다. 예 1:
입력
["MyHashSet", "추가", "추가", "포함", "포함", "추가", "포함", "제거", "포함"]
[[], [1], [2], [1], [3], [2], [2], [2], [2]]
산출
[널, 널, 널, 참, 거짓, 널, 참, 널, 거짓]
설명
MyHashSet myHashSet = new MyHashSet();
myHashSet.add(1);//세트 = [1]
myHashSet.add(2);//세트 = [1, 2]
myHashSet.contains(1);//참 반환
myHashSet.contains(3);//False 반환, (찾을 수 없음)
myHashSet.add(2);//세트 = [1, 2]
myHashSet.contains(2);//참 반환
myHashSet.remove(2);//세트 = [1]
myHashSet.contains(2);//False 반환, (이미 제거됨)
제약:
0 <= key <= 106
104
호출은 add
, remove
및 contains
로 이루어집니다. 해결책:
import bisect
class MyHashSet:
def __init__(self):
self.size = 107
self.arr = [[] for i in range(self.size)]
def hfn(self, key):
key = ((key >> 16) ^ key) * 0x45d9f3b
key = ((key >> 16) ^ key) * 0x45d9f3b
key = (key >> 16) ^ key
return key % self.size
def add(self, key: int) -> None:
pos = bisect.bisect_left(self.arr[self.hfn(key)], key)
if pos >= len(self.arr[self.hfn(key)]) or self.arr[self.hfn(key)][pos] != key:
self.arr[self.hfn(key)].insert(pos, key)
def remove(self, key: int) -> None:
pos = bisect.bisect_left(self.arr[self.hfn(key)], key)
if pos < len(self.arr[self.hfn(key)]) and self.arr[self.hfn(key)][pos] == key:
del self.arr[self.hfn(key)][pos]
def contains(self, key: int) -> bool:
pos = bisect.bisect_left(self.arr[self.hfn(key)], key)
if pos < len(self.arr[self.hfn(key)]) and self.arr[self.hfn(key)][pos] == key:
return True
return False
# Your MyHashSet object will be instantiated and called as such:
# obj = MyHashSet()
# obj.add(key)
# obj.remove(key)
# param_3 = obj.contains(key)
Reference
이 문제에 관하여(디자인 해시셋), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/theabbie/design-hashset-5eo8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)