0
点赞
收藏
分享

微信扫一扫

2022-2-6 Leetcode 6002.设计位集

绣文字 2022-02-06 阅读 37

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Bitset {
private:
    vector<int> bitSet;
public:
    Bitset(int size) {
        bitSet.resize(size,0);
    }
    
    void fix(int idx) {
        if(idx < bitSet.size())
        bitSet[idx] = 1;
    }
    
    void unfix(int idx) {
        if(idx < bitSet.size())
         bitSet[idx] = 0;
    }
    
    void flip() {
        for(int i = 0;i < bitSet.size();i++){
            if(bitSet[i])
                bitSet[i] = 0;
            else bitSet[i] = 1;
        }
    }
    
    bool all() {
        return accumulate(bitSet.begin(),bitSet.end(),0) == bitSet.size();
    }
    
    bool one() {
        for(int i = 0;i < bitSet.size();i++){
            if(bitSet[i])
                return true;
        }
        return false;
    }
    
    int count() {
        return accumulate(bitSet.begin(),bitSet.end(),0);
    }
    
    string toString() {
        string ret;
        for(int i = 0;i < bitSet.size();i++){
            ret += (bitSet[i] == 1? '1':'0');
        }
        return ret;
    }
};

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

在这里插入图片描述

class Bitset {
private:
    vector<unsigned long long int> bitSet;
    int pos;
    int vecsize;
public:
    Bitset(int size) {
        pos = size%64;
        bitSet.resize(size/64+1);
    }
    
    void fix(int idx) {
        bitSet[idx/64] |= 1 <<(idx%64);
    }
    
    void unfix(int idx) {
        bitSet[idx/64] -= 1 <<(idx%64);
    }
    
    void flip() {
        for(int i = 0;i < bitSet.size();i++){
            bitSet[i] = ~bitSet[i];
        }
    }
    
    bool all() {
        for(int i = 0;i < bitSet.size()-1;i++){
            if(bitSet[i] != (unsigned long long)18446744073709551615)
                return false;
        }
        unsigned long long backNum,back = 0;
        for(int i = 0;i < pos;i++){
            backNum |= 1<<i;
            back |= 1&(bitSet.back()>>i );
        }
        
        return backNum == back;
        
        
    }
    
    bool one() {
        return accumulate(bitSet.begin(),bitSet.end(),0) !=  0;
    }
    
    int count() {
        int ret = 0;
        for(int i = 0;i < bitSet.size()-1;i++){
            for(int j = 0;j < 64;j++){
                ret += ((1&(bitSet[i]>>j) == 1)?1:0);
            }
        }
        
        for(int j = 0;j < pos;j++){
                ret += ((1&(bitSet.back()>>j) == 1)?1:0);
            }
        return ret;
        
    }
    
    string toString() {
        string ret;
        for(int i = 0;i < bitSet.size()-1;i++){
            for(int j = 0;j < 64;j++){
                ret += ((1&(bitSet[i]>>j)) == 1?'1':'0');
            }
        }
        for(int j = 0;j < pos;j++){
                ret += ((1&(bitSet.back()>>j)) == 1?'1':'0');
            }
        return ret;
    }
};

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

模拟即可

class Bitset {
public:
    int size = 0;
    //总长度
    bool judge = false;
    //判断是否反转,不会实际反转,只要不实际反转操作就不需要扫描花费时间
    int cnt = 0;
    //统计1的个数
    string res;
    Bitset(int size) {
        this->size = size;
        for (int i = 0; i < size;++i)
        {
            res.push_back('0');
        }
    }

    void fix(int idx) {
    //通过是否反转来判断是否需要设置成1
        if (judge)
        {
            if (res[idx] == '0') return;
            res[idx] = '0';
            cnt++;
        }
        else
        {
            if (res[idx] == '1') return;
            res[idx] = '1';
            cnt++;
        }
    }

    void unfix(int idx) {
        if (judge)
        {
            if (res[idx] == '1') return;
            res[idx] = '1';
            cnt--;
        }
        else
        {
            if (res[idx] == '0') return;
            res[idx] = '0';
            cnt--;
        }
    }

    void flip() {
        judge = !judge;
        cnt = size - cnt;
    }

    bool all() {
        return cnt == size;
    }

    bool one() {
        return cnt > 0;
    }

    int count() {
        return cnt;
    }

    string toString() {
        if (judge)
        {
            string ans;
            for (int i = 0; i < size; ++i)
            {
                if(res[i]=='1') ans.push_back('0');
                else ans.push_back('1');
            }
            return ans;
        }
        return res;
    }
};

作者:hu-zhe
链接:https://leetcode-cn.com/problems/design-bitset/solution/mo-ni-ji-ke-zhen-gou-zao-tie-chao-shi-by-cwxg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
举报

相关推荐

0 条评论