Medium

Design BitsetPython

Full explanation · Time ctor: O(n) fix: O(1) fix: O(1) unfix: O(1) flip: O(1) all: O(1) one: O(1) count: O(1) toString: O(n) · Space O(n)

# Time:  ctor:     O(n)
#        fix:      O(1)
#        unfix:    O(1)
#        flip:     O(1)
#        all:      O(1)
#        one:      O(1)
#        count:    O(1)
#        toString: O(n)
# Space: O(n)

# design
class Bitset(object):

    def __init__(self, size):
        """
        :type size: int
        """
        self.__lookup = [False]*size
        self.__flip = False
        self.__cnt = 0

    def fix(self, idx):
        """
        :type idx: int
        :rtype: None
        """
        if self.__lookup[idx] == self.__flip:
            self.__lookup[idx] = not self.__lookup[idx]
            self.__cnt += 1
            
    def unfix(self, idx):
        """
        :type idx: int
        :rtype: None
        """
        if self.__lookup[idx] != self.__flip:
            self.__lookup[idx] = not self.__lookup[idx]
            self.__cnt -= 1

    def flip(self):
        """
        :rtype: None
        """
        self.__flip = not self.__flip
        self.__cnt = len(self.__lookup)-self.__cnt
        

    def all(self):
        """
        :rtype: bool
        """
        return self.__cnt == len(self.__lookup)

    def one(self):
        """
        :rtype: bool
        """
        return self.__cnt >= 1

    def count(self):
        """
        :rtype: int
        """
        return self.__cnt

    def toString(self):
        """
        :rtype: str
        """
        result = ['']*len(self.__lookup)
        for i, x in enumerate(self.__lookup):
            result[i] = '1' if x != self.__flip else '0'
        return "".join(result)