class Bitset {
private:
vector<int> bitSet;
public:
Bitset(int size) {
bitSet.resize(size,0);
}
void fix(int idx) {
if(idx < bitSet.size())
bitSet[idx] = 1;
}
void unfix(int idx) {
if(idx < bitSet.size())
bitSet[idx] = 0;
}
void flip() {
for(int i = 0;i < bitSet.size();i++){
if(bitSet[i])
bitSet[i] = 0;
else bitSet[i] = 1;
}
}
bool all() {
return accumulate(bitSet.begin(),bitSet.end(),0) == bitSet.size();
}
bool one() {
for(int i = 0;i < bitSet.size();i++){
if(bitSet[i])
return true;
}
return false;
}
int count() {
return accumulate(bitSet.begin(),bitSet.end(),0);
}
string toString() {
string ret;
for(int i = 0;i < bitSet.size();i++){
ret += (bitSet[i] == 1? '1':'0');
}
return ret;
}
};
/**
* Your Bitset object will be instantiated and called as such:
* Bitset* obj = new Bitset(size);
* obj->fix(idx);
* obj->unfix(idx);
* obj->flip();
* bool param_4 = obj->all();
* bool param_5 = obj->one();
* int param_6 = obj->count();
* string param_7 = obj->toString();
*/
class Bitset {
private:
vector<unsigned long long int> bitSet;
int pos;
int vecsize;
public:
Bitset(int size) {
pos = size%64;
bitSet.resize(size/64+1);
}
void fix(int idx) {
bitSet[idx/64] |= 1 <<(idx%64);
}
void unfix(int idx) {
bitSet[idx/64] -= 1 <<(idx%64);
}
void flip() {
for(int i = 0;i < bitSet.size();i++){
bitSet[i] = ~bitSet[i];
}
}
bool all() {
for(int i = 0;i < bitSet.size()-1;i++){
if(bitSet[i] != (unsigned long long)18446744073709551615)
return false;
}
unsigned long long backNum,back = 0;
for(int i = 0;i < pos;i++){
backNum |= 1<<i;
back |= 1&(bitSet.back()>>i );
}
return backNum == back;
}
bool one() {
return accumulate(bitSet.begin(),bitSet.end(),0) != 0;
}
int count() {
int ret = 0;
for(int i = 0;i < bitSet.size()-1;i++){
for(int j = 0;j < 64;j++){
ret += ((1&(bitSet[i]>>j) == 1)?1:0);
}
}
for(int j = 0;j < pos;j++){
ret += ((1&(bitSet.back()>>j) == 1)?1:0);
}
return ret;
}
string toString() {
string ret;
for(int i = 0;i < bitSet.size()-1;i++){
for(int j = 0;j < 64;j++){
ret += ((1&(bitSet[i]>>j)) == 1?'1':'0');
}
}
for(int j = 0;j < pos;j++){
ret += ((1&(bitSet.back()>>j)) == 1?'1':'0');
}
return ret;
}
};
/**
* Your Bitset object will be instantiated and called as such:
* Bitset* obj = new Bitset(size);
* obj->fix(idx);
* obj->unfix(idx);
* obj->flip();
* bool param_4 = obj->all();
* bool param_5 = obj->one();
* int param_6 = obj->count();
* string param_7 = obj->toString();
*/
模拟即可
class Bitset {
public:
int size = 0;
//总长度
bool judge = false;
//判断是否反转,不会实际反转,只要不实际反转操作就不需要扫描花费时间
int cnt = 0;
//统计1的个数
string res;
Bitset(int size) {
this->size = size;
for (int i = 0; i < size;++i)
{
res.push_back('0');
}
}
void fix(int idx) {
//通过是否反转来判断是否需要设置成1
if (judge)
{
if (res[idx] == '0') return;
res[idx] = '0';
cnt++;
}
else
{
if (res[idx] == '1') return;
res[idx] = '1';
cnt++;
}
}
void unfix(int idx) {
if (judge)
{
if (res[idx] == '1') return;
res[idx] = '1';
cnt--;
}
else
{
if (res[idx] == '0') return;
res[idx] = '0';
cnt--;
}
}
void flip() {
judge = !judge;
cnt = size - cnt;
}
bool all() {
return cnt == size;
}
bool one() {
return cnt > 0;
}
int count() {
return cnt;
}
string toString() {
if (judge)
{
string ans;
for (int i = 0; i < size; ++i)
{
if(res[i]=='1') ans.push_back('0');
else ans.push_back('1');
}
return ans;
}
return res;
}
};
作者:hu-zhe
链接:https://leetcode-cn.com/problems/design-bitset/solution/mo-ni-ji-ke-zhen-gou-zao-tie-chao-shi-by-cwxg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。