---
# System prepended metadata

title: 2166. Design Bitset
tags: [Leetcode, Design, Medium]

---

# 2166. Design Bitset
###### tags: `Leetcode` `Medium` `Design`
Link: https://leetcode.com/problems/design-bitset/description/
## 思路
```zeroCnt/oneCnt```表示当前实际bit sequence里面有几个0/1(如果需要flip 就是已经flip过的seq里面到底有多少0/1)
```flip```如果是true那么说明```nums```flip一次才是答案 如果是false说明```nums```本身就是答案

```fix()``` 我们需要检查```flip```和```nums[idx]``` 
如果```flip```是```false``` ```nums[idx]```是```true``` 说明真正在idx的数字就是1 不用做任何事 
反之如果```flip```是```true``` ```nums[idx]```是```false``` 说明真正在idx就是1
如果这两种情况都不符合 我们需要给```nums[idx]```重新赋值 并且更新```zeroCnt/oneCnt```
因为对于真正数字(如果需要```flip``` 就是已经flip过的seq)的操作 是把一个1变成了0 所以```oneCnt```肯定是加1的
## Code
```java=
class Bitset {
    int size, zeroCnt, oneCnt;
    boolean flip;
    boolean[] nums;
    public Bitset(int size) {
        this.size = size;
        zeroCnt = size;
        oneCnt = 0;
        flip = false;
        nums = new boolean[size];
    }
    
    public void fix(int idx) {
        if(!flip && nums[idx]==true) return;
        else if(flip && nums[idx]==false) return;
        nums[idx] = !flip;
        oneCnt++;
        zeroCnt--;
    }
    
    public void unfix(int idx) {
        if(!flip && nums[idx]==false) return;
        else if(flip && nums[idx]==true) return;
        nums[idx] = flip;
        oneCnt--;
        zeroCnt++;
    }
    
    public void flip() {
        flip = !flip;
        zeroCnt = oneCnt;
        oneCnt = size-zeroCnt;
    }
    
    public boolean all() {
        return zeroCnt==0;
    }
    
    public boolean one() {
        return oneCnt>=1;
    }
    
    public int count() {
        return oneCnt;
    }
    
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<size; i++){
            if(!flip) sb.append(nums[i]?'1':'0');
            else sb.append(nums[i]?'0':'1');
        }
        return sb.toString();
    }
}
```