数据结构与算法之位运算: LeetCode 2166. 设计位集 (Ts版)

ops/2025/2/2 6:15:04/

设计位集

  • https://leetcode.cn/problems/design-bitset/description/

描述

  • 位集 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 <= 1 0 5 10^5 105
  • 0 <= idx <= size - 1
  • 至多调用 fix、unfix、flip、all、one、count 和 toString 方法 总共 1 0 5 10^5 105
  • 至少调用 all、one、count 或 toString 方法一次
  • 至多调用 toString 方法 5 次

Typescript 版算法实现


1 ) 方案1:利用数组实现

class Bitset {private arr: number[];   // 存储每一位的数组private cnt: number;     // 1 的个数private reversed: number; // 反转操作的次数奇偶性(0 或 1)constructor(size: number) {this.arr = new Array(size).fill(0);this.cnt = 0;this.reversed = 0;}fix(idx: number): void {if ((this.arr[idx] ^ this.reversed) === 0) {this.arr[idx] ^= 1;this.cnt++;}}unfix(idx: number): void {if ((this.arr[idx] ^ this.reversed) === 1) {this.arr[idx] ^= 1;this.cnt--;}}flip(): void {this.reversed ^= 1;this.cnt = this.arr.length - this.cnt;}all(): boolean {return this.cnt === this.arr.length;}one(): boolean {return this.cnt > 0;}count(): number {return this.cnt;}toString(): string {let res = '';for (let bit of this.arr) {res += (bit ^ this.reversed).toString();}return res;}
}/*** Your Bitset object will be instantiated and called as such:* var obj = new Bitset(size)* obj.fix(idx)* obj.unfix(idx)* obj.flip()* var param_4 = obj.all()* var param_5 = obj.one()* var param_6 = obj.count()* var param_7 = obj.toString()*/

2 ) 方案2:另一种方式

class Bitset {private set: number[]; // 存储位的数组,每个元素存储32位private n: number;     // 总位数private ones: number;  // 当前1的数量private reverse: number; // 反转操作的次数奇偶性constructor(size: number) {this.n = size;this.set = new Array(Math.ceil(size / 32)).fill(0);this.ones = 0;this.reverse = 0;}fix(idx: number): void {const index = Math.floor(idx / 32);const bit = idx % 32;const flag = (this.set[index] >> bit) & 1;if ((this.reverse ^ flag) === 0) {this.set[index] ^= 1 << bit;++this.ones;}}unfix(idx: number): void {const index = Math.floor(idx / 32);const bit = idx % 32;const flag = (this.set[index] >> bit) & 1;if ((this.reverse ^ flag) === 1) {this.set[index] ^= 1 << bit;--this.ones;}}flip(): void {this.reverse ^= 1;this.ones = this.n - this.ones;}all(): boolean {return this.ones === this.n;}one(): boolean {return this.ones > 0;}count(): number {return this.ones;}toString(): string {let res: string = '';for (let i = 0; i < this.n; i++) {const index = Math.floor(i / 32);const bit = i % 32;const flag = (this.set[index] >> bit) & 1;res += this.reverse ^ flag;}return res;}
}/*** Your Bitset object will be instantiated and called as such:* var obj = new Bitset(size)* obj.fix(idx)* obj.unfix(idx)* obj.flip()* var param_4 = obj.all()* var param_5 = obj.one()* var param_6 = obj.count()* var param_7 = obj.toString()*/

http://www.ppmy.cn/ops/154963.html

相关文章

pytorch使用SVM实现文本分类

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 完整代码&#xff1a; import torch import torch.nn as nn import torch.optim as optim import jieba import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extract…

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…

C++语法·食二

目录 目录 迭代器 1.意义 2.分类 &#xff08;1&#xff09;单向迭代器 &#xff08;2&#xff09;双向迭代器 &#xff08;3&#xff09;随机迭代器 list list的使用 1.构造 2.容量 3.访问和遍历&#xff08;list不支持[ ]下标访问&#xff09; 4.修改 5.操作 …

10.4 LangChain核心架构揭秘:模块化设计如何重塑大模型应用开发?

LangChain核心架构揭秘:模块化设计如何重塑大模型应用开发? 关键词: LangChain模块化设计、大模型开发框架、LangChain核心概念、AI应用开发、LLM工程化 一、LangChain的模块化设计哲学:从“手工作坊”到“工业化生产” 传统开发痛点: 代码重复:每个项目从零开始编写胶…

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

小白爬虫——selenium入门超详细教程

目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 ?3.1.6、综合小案例 3.2、对页面元素进行操作 3…