https://leetcode.com/problems/design-bitset/
bitset的实现,可能和自己想的不一样
个人解答
class Bitset:
def __init__(self, size: int):
self.setBits = set()
self.size = size
self.isFlip = False
def fix(self, idx: int) -> None:
if not self.isFlip:
self.setBits.add(idx)
else:
self.setBits.discard(idx)
def unfix(self, idx: int) -> None:
if not self.isFlip:
self.setBits.discard(idx)
else:
self.setBits.add(idx)
def flip(self) -> None:
self.isFlip = not self.isFlip
def all(self) -> bool:
if not self.isFlip:
return len(self.setBits) == self.size
else:
return len(self.setBits) == 0
def one(self) -> bool:
if not self.isFlip:
return len(self.setBits) > 0
else:
return len(self.setBits) < self.size
def count(self) -> int:
if not self.isFlip:
return len(self.setBits)
else:
return self.size - len(self.setBits)
def toString(self) -> str:
if not self.isFlip:
return ''.join(['1' if (i in self.setBits) else '0' for i in range(self.size)])
else:
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):
self.x = 0
self.size = size
self.cnt = 0
def fix(self, idx: int) -> None:
if (self.x & (1 << idx)) == 0:
self.cnt += 1
self.x |= 1 << idx
def unfix(self, idx: int) -> None:
if (self.x & (1 << idx)) != 0:
self.cnt -= 1
self.x &= ((1 << self.size) - 1) - (1 << idx)
def flip(self) -> None:
self.cnt = self.size - self.cnt
self.x ^= ((1 << self.size) - 1)
def all(self) -> bool:
return self.x == ((1 << self.size) - 1)
def one(self) -> bool:
return self.x != 0
def count(self) -> int:
# return bin(self.x).count('1')
# return self.x.bit_count()
return self.cnt
def toString(self) -> str:
return f'{self.x:0b}'.zfill(self.size)[::-1]
```
然而,看了题解之后,发现效率更高的方法是采用set来实现。
出于题目的特性,其它的都要保证O(1)的操作,toString可以不用管,那么讲道理用集合的方式更靠谱一点。
而且,python语言帮忙处理了很长的数,但其它的语言还要考虑越界等问题,所以set的方式实现是更合理的。