Leetcode.2166 设计位集

题目链接

Leetcode.2166 设计位集 Rating : 1752

题目描述

位集 Bitset是一种能以紧凑形式存储位的数据结构。

请你实现 Bitset类。

  • Bitset(int size)size个位初始化 Bitset ,所有位都是 0
  • void fix(int idx)将下标为 idx的位上的值更新为 1 。如果值已经是 1 ,则不会发生任何改变。
  • void unfix(int idx)将下标为 idx的位上的值更新为 0 。如果值已经是 0 ,则不会发生任何改变。
  • void flip()翻转 Bitset中每一位上的值。换句话说,所有值为 0 的位将会变成 1 ,反之亦然。
  • boolean all()检查 Bitset中 每一位 的值是否都是 1 。如果满足此条件,返回 true;否则,返回 false
  • boolean one()检查 Bitset中 是否 至少一位 的值是 1 。如果满足此条件,返回 true;否则,返回 false
  • int count()返回 Bitset中值为 1的位的 总数 。
  • String toString()返回 Bitset的当前组成情况。注意,在结果字符串中,第 i个下标处的字符应该与 Bitset中的第 i位一致。

解法:懒标记模拟

用一个列表 nums[size]记录所有的位。

用一个标记 f,当 f = 0时,说明没有被翻转。当 f = 1,说明已经被翻转了。

cnt记录位集中 1的个数。当 f = 1时,即被翻转的时候,cnt就变为 nums.size() - cnt

时间复杂度: toString O ( n ) O(n) O(n) 其他 O ( n ) O(n) O(n)

C++代码:


class Bitset {
public:
    vector<int> nums;
    int f;
    int cnt;
    Bitset(int size) {
        nums.resize(size);
        f = 0;
        cnt = 0;
    }
    
    void fix(int idx) {
        if(nums[idx] == f){
            nums[idx] ^= 1;
            cnt++;
        }
    }
    
    void unfix(int idx) {
        if(nums[idx] != f){
            nums[idx] ^= 1;
            cnt--;
        }
    }
    
    void flip() {
        cnt = nums.size() - cnt;
        f ^= 1;
    }
    
    bool all() {
        return cnt == nums.size();
    }
    
    bool one() {
        return cnt > 0;
    }
    
    int count() {
        return cnt;
    }
    
    string toString() {
        string s;
        for(auto x:nums) s.push_back('0' + (x ^ f));
        return s;
    }
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值