https://leetcode.com/problems/design-bitset/
bitset的实现,可能和自己想的不一样


个人解答

  1. class Bitset:
  2. def __init__(self, size: int):
  3. self.setBits = set()
  4. self.size = size
  5. self.isFlip = False
  6. def fix(self, idx: int) -> None:
  7. if not self.isFlip:
  8. self.setBits.add(idx)
  9. else:
  10. self.setBits.discard(idx)
  11. def unfix(self, idx: int) -> None:
  12. if not self.isFlip:
  13. self.setBits.discard(idx)
  14. else:
  15. self.setBits.add(idx)
  16. def flip(self) -> None:
  17. self.isFlip = not self.isFlip
  18. def all(self) -> bool:
  19. if not self.isFlip:
  20. return len(self.setBits) == self.size
  21. else:
  22. return len(self.setBits) == 0
  23. def one(self) -> bool:
  24. if not self.isFlip:
  25. return len(self.setBits) > 0
  26. else:
  27. return len(self.setBits) < self.size
  28. def count(self) -> int:
  29. if not self.isFlip:
  30. return len(self.setBits)
  31. else:
  32. return self.size - len(self.setBits)
  33. def toString(self) -> str:
  34. if not self.isFlip:
  35. return ''.join(['1' if (i in self.setBits) else '0' for i in range(self.size)])
  36. else:
  37. return ''.join(['0' if (i in self.setBits) else '1' for i in range(self.size)])

题目分析

自己本以为是位运算操作,但发现反而更慢。
不过位运算也需要一些注意的地方:

  • count操作需要O(1)的复杂度,因此不能简单的bin(x).count('1'),可以采用内置的bit_count()函数,也可以在每个操作的过程中记录
  • toString中,可以学习一些字符串格式化的方法 ```python class Bitset:

    def init(self, size: int):

    1. self.x = 0
    2. self.size = size
    3. self.cnt = 0
  1. def fix(self, idx: int) -> None:
  2. if (self.x & (1 << idx)) == 0:
  3. self.cnt += 1
  4. self.x |= 1 << idx
  5. def unfix(self, idx: int) -> None:
  6. if (self.x & (1 << idx)) != 0:
  7. self.cnt -= 1
  8. self.x &= ((1 << self.size) - 1) - (1 << idx)
  9. def flip(self) -> None:
  10. self.cnt = self.size - self.cnt
  11. self.x ^= ((1 << self.size) - 1)
  12. def all(self) -> bool:
  13. return self.x == ((1 << self.size) - 1)
  14. def one(self) -> bool:
  15. return self.x != 0
  16. def count(self) -> int:
  17. # return bin(self.x).count('1')
  18. # return self.x.bit_count()
  19. return self.cnt
  20. def toString(self) -> str:
  21. return f'{self.x:0b}'.zfill(self.size)[::-1]

``` 然而,看了题解之后,发现效率更高的方法是采用set来实现。
出于题目的特性,其它的都要保证O(1)的操作,toString可以不用管,那么讲道理用集合的方式更靠谱一点。
而且,python语言帮忙处理了很长的数,但其它的语言还要考虑越界等问题,所以set的方式实现是更合理的。