2166. 设计位集

Problem: 2166. 设计位集

思路

这道题要求设计一个位集(Bitset)类,实现以下功能:

  • 添加数字
  • 删除数字
  • 反转位集
  • 判断位集是否全为1
  • 判断位集是否至少有一个1
  • 统计位集中1的个数
  • 将位集转换为字符串表示

我们可以使用一个整型数组来存储位集的数据,每个整型数可以表示32个位。然后,我们可以使用位运算来实现各种功能。

解题方法

根据题目要求,我们可以设计一个 Bitset 类,其中包含以下成员变量:

  • set:整型数组,用于存储位集的数据
  • ones:整型变量,表示位集中1的个数
  • zeros:整型变量,表示位集中0的个数
  • reverse:布尔变量,表示位集是否反转
  • size:整型变量,表示位集的大小

然后,我们可以实现以下方法:

  • fix(int idx):添加数字到位集中。首先,我们需要计算数字在整型数组中的索引和位偏移量。然后,根据是否反转位集,判断是否需要添加数字到位集中,并更新相应的计数器。
  • unfix(int idx):从位集中删除数字。首先,我们需要计算数字在整型数组中的索引和位偏移量。然后,根据是否反转位集,判断是否需要从位集中删除数字,并更新相应的计数器。
  • flip():反转位集。将 reverse 变量取反,并交换 oneszeros 的值。
  • all():判断位集是否全为1。如果 ones 等于位集的大小,则返回 true,否则返回 false
  • one():判断位集是否至少有一个1。如果 ones 大于0,则返回 true,否则返回 false
  • count():统计位集中1的个数。直接返回 ones 的值。
  • toString():将位集转换为字符串表示。我们可以遍历整型数组中的每个整型数,然后将每个位的状态转换为字符,并拼接到字符串中。

复杂度

时间复杂度:添加数字和删除数字的时间复杂度为 O ( 1 ) O(1) O(1),反转位集、判断位集是否全为1、判断位集是否至少有一个1、统计位集中1的个数和将位集转换为字符串表示的时间复杂度为 O ( n ) O(n) O(n),其中 n 为位集的大小。

空间复杂度:整型数组的空间复杂度为 O ( n ) O(n) O(n),其中 n 为位集的大小。

代码

class Bitset {
    public int[] set;
    public int ones;
    public int zeros;
    public boolean reverse;

    public final int size;

    public Bitset(int n) {
        set = new int[(n + 31) / 32];
        size = n;
        ones = 0;
        zeros = n;
        reverse = false;
    }

    // 添加数字
    public void fix(int idx) {
        int index = idx / 32;
        int bit = idx % 32;
        if (!reverse) {
            if ((set[index] & (1 << bit)) == 0) {
                zeros--;
                ones++;
                set[index] |= (1 << bit);
            }
        } else {
            if ((set[index] & (1 << bit)) != 0) {
                zeros--;
                ones++;
                set[index] ^= (1 << bit);
            }
        }

    }

    // 删除数字
    public void unfix(int idx) {
        int index = idx / 32;
        int bit = idx % 32;
        if (!reverse) {
            if ((set[index] & (1 << bit)) != 0) {
                ones--;
                zeros++;
                set[index] ^= (1 << bit);
            }
        } else {
            if ((set[index] & (1 << bit)) == 0) {
                ones--;
                zeros++;
                set[index] |= (1 << bit);
            }
        }
    }

    public void flip() {
        reverse = !reverse;
        int tmp = zeros;
        zeros = ones;
        ones = tmp;
    }

    public boolean all() {
        return ones == size;
    }

    public boolean one() {
        return ones > 0;
    }

    public int count() {
        return ones;
    }

    public String toString() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0, k = 0, number, status; i < size; k++) {
            number = set[k];
            for (int j = 0; j < 32 && i < size; j++, i++) {
                status = (number >> j) & 1;
                status ^= reverse ? 1 : 0;
                sb.append(status);
            }
        }
        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();
 */
  • 57
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《法分析与设计习题集整理.pdf》是一本用于法学学习和练习的习题集整理。该习题集的目的是帮助学生巩固法学理论知识,提升法学分析和设计能力。 该习题集整理了一系列与法学相关的题目,涵盖了不同领域的法律问题,如刑法、民法、行政法等。每个章节都按照特定的法学概念或主题进行组织和分类,有助于学生系统地掌握不同领域的法律规定。 每个题目都提供了背景情景和相关法律条文,要求学生分析并解答问题。通过解答这些问题,学生能够理解和运用各种法律原则、规则和判例,培养独立思考和分析问题的能力。 此外,这本习题集还提供了参考答案和解析,以便学生对自己的答案进行对比和评估。参考答案和解析部分详细解释了每个问题的解题思路和关键要点,有助于学生理解问题的本质和解决问题的方法。 《法分析与设计习题集整理.pdf》对于法学专业的学生和从业人员都具有重要价值。通过完成这些题目,可以在理论知识的基础上加深对法学实践的理解,并提升解决法律问题的能力。这本习题集不仅适用于法学专业的本科生和研究生,也可供法律从业人员进行法律知识的巩固和提高。 总之,《法分析与设计习题集整理.pdf》是一本有益于法学学习和练习的工具书,通过解答其中的问题,可以提升法学知识的运用能力,并增强对法律问题的分析和解决能力。它的整理形式和参考答案和解析的提供都为学生和从业人员提供了便利和帮助。 ### 回答2: 《法分析与设计习题集整理.pdf》是一本关于法律分析和设计方面的习题集整理的电子文档。该习题集整理的目的是为了帮助学习者加强对法律分析和设计的理解和应用能力。 这本习题集整理的内容涵盖了法律分析和设计的基本原理、方法和实例。通过解答这些习题,学习者可以锻炼自己的思维逻辑、分析问题的能力,进一步理解和掌握法律分析与设计的要点。 该习题集整理的题目涉及了多个法律领域,如民法、刑法、行政法等。学习者可以根据自身需要选择性地进行习题练习和讨论,从而深入了解并运用法律分析和设计的知识。 《法分析与设计习题集整理.pdf》的特点之一是习题设置灵活多样。习题形式包括案例分析、论述题、选择题等,旨在培养学习者的全面思考和批判性思维能力。 此外,该习题集整理还提供了详细且准确的答案解析。在学习者完成习题后,可以对照答案解析,检验答案的正确与否,并及时纠正自己的错误。 总之,《法分析与设计习题集整理.pdf》是一本值得学习者使用的法律学习资料。通过解答其中的习题,可以帮助学习者系统化地学习和运用法律分析和设计的知识,提升自己在法律领域的能力和素养。 ### 回答3: 《法分析与设计习题集整理.pdf》是一本对法律分析和设计进行习题整理的电子书籍。该习题集的编写目的是帮助读者加深对法律分析和设计的理解,并提供实践操作的机会。 这本习题集包含了多个章节,每个章节都涵盖了不同的法律领域和相关概念。每个章节中都包含了一系列的习题和案例,读者可以通过完成这些习题来巩固所学知识。 习题的设计非常灵活,有些是选择题,有些是案例分析题,还有些是论述题。通过这些不同形式的习题,读者可以培养自己对法律问题的分析和解决能力。 为了更好地帮助读者学习,每个习题都附有详细的解答和解析,读者可以对照解析来查漏补缺,提高自己的法律分析水平。 这本习题集的主要读者对象是法学专业的学生和法律从业人员。对于法学专业的学生来说,这本习题集可以帮助他们在实践中应用所学的法律理论知识。对于法律从业人员来说,这本习题集可以帮助他们巩固和扩展自己的专业知识,提高自己的工作能力。 总之,《法分析与设计习题集整理.pdf》是一本有益于法学专业学生和法律从业人员的学习工具,通过完成习题和分析案例,读者可以提高自己的法律分析和解决问题的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱跑步的程序员~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值