디자인 해시셋

2326 단어 theabbieleetcodedsa
내장된 해시 테이블 라이브러리를 사용하지 않고 HashSet을 설계합니다.

구현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 , removecontains 로 이루어집니다.

  • 해결책:

    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)
    

    좋은 웹페이지 즐겨찾기