Skip to content

Commit 7dd92f4

Browse files
committed
feat: add solutions to lcof problem: No.15
1 parent b1db680 commit 7dd92f4

File tree

3 files changed

+96
-38
lines changed

3 files changed

+96
-38
lines changed

lcof/面试题15. 二进制中1的个数/README.md

+90-31
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,24 @@
5252

5353
## 解法
5454

55-
`n & (n - 1)` 会消除 n 中最后一位中的 1。
55+
**方法一:位运算**
56+
57+
由于 `n & (n - 1)` 会消除 $n$ 的二进制表示中的最后一个 $1$,因此对 $n$ 重复该操作,直到 $n$ 变成 $0$,此时的操作次数即为 $n$ 的二进制表示中的 $1$ 的个数。
58+
59+
或者,我们可以用 `lowbit` 函数来获取 $n$ 的二进制表示中的最后一个 $1$,然后将 $n$ 减去这个 $1$,再重复该操作,直到 $n$ 变成 $0$,此时的操作次数即为 $n$ 的二进制表示中的 $1$ 的个数。`lowbit(x)=x&(-x)`
60+
61+
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为输入的整数。
5662

5763
<!-- tabs:start -->
5864

5965
### **Python3**
6066

67+
```python
68+
class Solution:
69+
def hammingWeight(self, n: int) -> int:
70+
return n.bit_count()
71+
```
72+
6173
```python
6274
class Solution:
6375
def hammingWeight(self, n: int) -> int:
@@ -68,6 +80,16 @@ class Solution:
6880
return ans
6981
```
7082

83+
```python
84+
class Solution:
85+
def hammingWeight(self, n: int) -> int:
86+
ans = 0
87+
while n:
88+
n -= n & (-n)
89+
ans += 1
90+
return ans
91+
```
92+
7193
### **Java**
7294

7395
```java
@@ -84,33 +106,17 @@ public class Solution {
84106
}
85107
```
86108

87-
### **JavaScript**
88-
89-
```js
90-
/**
91-
* @param {number} n - a positive integer
92-
* @return {number}
93-
*/
94-
var hammingWeight = function (n) {
95-
let ans = 0;
96-
while (n != 0) {
97-
n &= n - 1;
98-
++ans;
109+
```java
110+
public class Solution {
111+
// you need to treat n as an unsigned value
112+
public int hammingWeight(int n) {
113+
int ans = 0;
114+
while (n != 0) {
115+
n -= n & -n;
116+
++ans;
117+
}
118+
return ans;
99119
}
100-
return ans;
101-
};
102-
```
103-
104-
### **Go**
105-
106-
```go
107-
func hammingWeight(num uint32) int {
108-
ans := 0
109-
for num != 0 {
110-
num &= num - 1
111-
ans++
112-
}
113-
return ans
114120
}
115121
```
116122

@@ -130,17 +136,70 @@ public:
130136
};
131137
```
132138
139+
```cpp
140+
class Solution {
141+
public:
142+
int hammingWeight(uint32_t n) {
143+
int ans = 0;
144+
while (n != 0) {
145+
n -= n & -n;
146+
++ans;
147+
}
148+
return ans;
149+
}
150+
};
151+
```
152+
153+
### **Go**
154+
155+
```go
156+
func hammingWeight(num uint32) (ans int) {
157+
for num != 0 {
158+
num &= num - 1
159+
ans++
160+
}
161+
return
162+
}
163+
```
164+
165+
```go
166+
func hammingWeight(num uint32) (ans int) {
167+
for num != 0 {
168+
num -= num & -num
169+
ans++
170+
}
171+
return
172+
}
173+
```
174+
175+
### **JavaScript**
176+
177+
```js
178+
/**
179+
* @param {number} n - a positive integer
180+
* @return {number}
181+
*/
182+
var hammingWeight = function (n) {
183+
let ans = 0;
184+
while (n != 0) {
185+
n &= n - 1;
186+
++ans;
187+
}
188+
return ans;
189+
};
190+
```
191+
133192
### **C#**
134193

135194
```cs
136195
public class Solution {
137196
public int HammingWeight(uint n) {
138-
int count = 0;
197+
int ans = 0;
139198
while (n != 0) {
140-
n = n & (n - 1);
141-
count++;
199+
n &= (n - 1);
200+
++ans;
142201
}
143-
return count;
202+
return ans;
144203
}
145204
}
146205
```
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
public class Solution {
22
public int HammingWeight(uint n) {
3-
int count = 0;
3+
int ans = 0;
44
while (n != 0) {
5-
n = n & (n - 1);
6-
count++;
5+
n &= (n - 1);
6+
++ans;
77
}
8-
return count;
8+
return ans;
99
}
1010
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
func hammingWeight(num uint32) int {
2-
ans := 0
1+
func hammingWeight(num uint32) (ans int) {
32
for num != 0 {
43
num &= num - 1
54
ans++
65
}
7-
return ans
6+
return
87
}

0 commit comments

Comments
 (0)