LeetCode-in-Java

2166. Design Bitset

Medium

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

import java.util.Arrays;

public 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();
 */