题目链接
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;
}
};