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