2166 设计位集(位运算)

1. 问题描述:

位集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 位一致。
 
示例:

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

解释

Bitset bs = new Bitset(5); // bitset = "00000".
bs.fix(3);     // 将 idx = 3 处的值更新为 1 ,此时 bitset = "00010" 。
bs.fix(1);     // 将 idx = 1 处的值更新为 1 ,此时 bitset = "01010" 。
bs.flip();     // 翻转每一位上的值,此时 bitset = "10101" 。
bs.all();      // 返回 False ,bitset 中的值不全为 1 。
bs.unfix(0);   // 将 idx = 0 处的值更新为 0 ,此时 bitset = "00101" 。
bs.flip();     // 翻转每一位上的值,此时 bitset = "11010" 。
bs.one();      // 返回 True ,至少存在一位的值为 1 。
bs.unfix(0);   // 将 idx = 0 处的值更新为 0 ,此时 bitset = "01010" 。
bs.count();    // 返回 2 ,当前有 2 位的值为 1 。
bs.toString(); // 返回 "01010" ,即 bitset 的当前组成情况。
 
提示:

1 <= size <= 10 ^ 5
0 <= idx <= size - 1
至多调用 fix、unfix、flip、all、one、count 和 toString 方法总共 10 ^ 5 次
至少调用 all、one、count 或 toString 方法一次
至多调用 toString 方法 5 次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-bitset/

2. 思路分析:

因为使用的是python语言,所以可以使用列表来模拟Bitset的每一位,因为每一位只涉及到0和1所以当某一位翻转偶数次的时候那么对于当前这一位是没有什么影响的,所以我们可以使用一个标记reversed来记录翻转的次数是奇数还是偶数,而且我们其实不关心对应的次数,所以可以使用异或操作来实现,0表示偶数次,1表示奇数次,因为涉及到1的个数,所以可以使用一个cnt变量来记录当前1的数目。

3. 代码如下:

class Bitset:
    def __init__(self, size: int):
        self.arr = [0] * size
        # 记录1的个数
        self.cnt = 0
        # reversed记录翻转了是奇数还是偶数次数
        self.reversed = 0

    def fix(self, idx: int) -> None:
        if self.arr[idx] ^ self.reversed == 0:
            self.arr[idx] ^= 1
            self.cnt += 1

    def unfix(self, idx: int) -> None:
        if self.arr[idx] ^ self.reversed:
            self.arr[idx] ^= 1
            self.cnt -= 1

    def flip(self) -> None:
        self.reversed ^= 1
        self.cnt = len(self.arr) - self.cnt

    def all(self) -> bool:
        return len(self.arr) == self.cnt

    def one(self) -> bool:
        return self.cnt > 0

    def count(self) -> int:
        return self.cnt

    def toString(self) -> str:
        res = ""
        for x in self.arr:
            res += str(x ^ self.reversed)
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值