2166. Design Bitset

Difficulty:
Related Topics:
Similar Questions:

Problem

A Bitset is a data structure that compactly stores bits.

Implement the Bitset class:

  Example 1:

Input
["Bitset", "fix", "fix", "flip", "all", "unfix", "flip", "one", "unfix", "count", "toString"]
[[5], [3], [1], [], [], [0], [], [], [0], [], []]
Output
[null, null, null, null, false, null, null, true, null, 2, "01010"]

Explanation
Bitset bs = new Bitset(5); // bitset = "00000".
bs.fix(3);     // the value at idx = 3 is updated to 1, so bitset = "00010".
bs.fix(1);     // the value at idx = 1 is updated to 1, so bitset = "01010". 
bs.flip();     // the value of each bit is flipped, so bitset = "10101". 
bs.all();      // return False, as not all values of the bitset are 1.
bs.unfix(0);   // the value at idx = 0 is updated to 0, so bitset = "00101".
bs.flip();     // the value of each bit is flipped, so bitset = "11010". 
bs.one();      // return True, as there is at least 1 index with value 1.
bs.unfix(0);   // the value at idx = 0 is updated to 0, so bitset = "01010".
bs.count();    // return 2, as there are 2 bits with value 1.
bs.toString(); // return "01010", which is the composition of bitset.

  Constraints:

Solution (Java)

class Bitset {
    private boolean[] bits;
    private boolean[] flipped;
    private int sz;
    private int cnt;

    public Bitset(int size) {
        sz = size;
        bits = new boolean[size];
        flipped = new boolean[size];
        Arrays.fill(flipped, true);
    }

    public void fix(int idx) {
        if (!bits[idx]) {
            bits[idx] ^= true;
            flipped[idx] ^= true;
            cnt += 1;
        }
    }

    public void unfix(int idx) {
        if (bits[idx]) {
            bits[idx] ^= true;
            flipped[idx] ^= true;
            cnt -= 1;
        }
    }

    public void flip() {
        boolean[] tmp = bits;
        bits = flipped;
        flipped = tmp;
        cnt = sz - cnt;
    }

    public boolean all() {
        return cnt == sz;
    }

    public boolean one() {
        return cnt > 0;
    }

    public int count() {
        return cnt;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (boolean b : bits) {
            sb.append(b ? '1' : '0');
        }
        return sb.toString();
    }
}

/**
 * Your Bitset object will be instantiated and called as such:
 * Bitset obj = new Bitset(size);
 * obj.fix(idx);
 * obj.unfix(idx);
 * obj.flip();
 * boolean param_4 = obj.all();
 * boolean param_5 = obj.one();
 * int param_6 = obj.count();
 * String param_7 = obj.toString();
 */

Explain:

nope.

Complexity: