-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathDesignBitSet.java
135 lines (115 loc) · 2.89 KB
/
DesignBitSet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*https://leetcode.com/problems/design-bitset/*/
//TLE
class Bitset {
int[] bits;
int oneCount, size;
public Bitset(int size) {
oneCount = 0;
bits = new int[size];
this.size = size;
}
public void fix(int idx) {
oneCount += 1-bits[idx];
bits[idx] = 1;
}
public void unfix(int idx) {
oneCount -= bits[idx];
bits[idx] = 0;
}
public void flip() {
for (int i = 0; i < size; ++i)
bits[i] = 1-bits[i];
oneCount = size-oneCount;
}
public boolean all() {
return oneCount == size;
}
public boolean one() {
return oneCount > 0;
}
public int count() {
return oneCount;
}
public String toString() {
StringBuilder result = new StringBuilder("");
for (int bit : bits)
result.append(bit);
return result.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();
*/
class Bitset {
int[] bits;
int oneCount, zeroCount, size;
boolean flipStatus;
public Bitset(int size) {
oneCount = 0;
zeroCount = size;
bits = new int[size];
this.size = size;
flipStatus = false;
}
public void fix(int idx) {
if (flipStatus) changeOneToZero(idx); else changeZeroToOne(idx);
}
public void unfix(int idx) {
if (flipStatus) changeZeroToOne(idx); else changeOneToZero(idx);
}
public void flip() {
flipStatus = !flipStatus;
}
public boolean all() {
return flipStatus ? (zeroCount == size) : (oneCount == size);
}
public boolean one() {
return flipStatus ? (zeroCount > 0) : (oneCount > 0);
}
public int count() {
return flipStatus ? zeroCount : oneCount;
}
public String toString() {
StringBuilder result = new StringBuilder("");
for (int bit : bits)
result.append(flipStatus ? 1-bit : bit);
return result.toString();
}
private void changeZeroToOne(int idx)
{
if (bits[idx] == 0)
{
++oneCount;
--zeroCount;
}
bits[idx] = 1;
}
private void changeOneToZero(int idx)
{
if (bits[idx] == 1)
{
--oneCount;
++zeroCount;
}
bits[idx] = 0;
}
}
/**
* 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();
*/