Skip to content

Commit 583a135

Browse files
authored
feat: add solutions to lcof2 problem: No.003 (#1418)
No.003.前n个数字二进制中1的个数
1 parent 946b540 commit 583a135

File tree

6 files changed

+77
-50
lines changed

6 files changed

+77
-50
lines changed

lcof2/剑指 Offer II 003. 前 n 个数字二进制中 1 的个数/README.md

+43-22
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
**方法一:动态规划**
63+
64+
我们定义 $f[i]$ 表示整数 $i$ 的二进制表示中 $1$ 的个数。那么对于一个整数 $i$,它的二进制表示中 $1$ 的个数为 $f[i \wedge (i - 1)] + 1$,其中 $i \wedge (i - 1)$ 是将 $i$ 的二进制表示中的最低位的 $1$ 变成 $0$ 之后的数,显然 $i \wedge (i - 1) \lt i$,且 $f[i \wedge (i - 1)]$ 已经被计算出来了,因此我们可以得到状态转移方程:
65+
66+
$$
67+
f[i] = f[i \wedge (i - 1)] + 1
68+
$$
69+
70+
时间复杂度 $O(n)$,其中 $n$ 是题目给定的整数。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
71+
6272
<!-- tabs:start -->
6373

6474
### **Python3**
@@ -68,10 +78,10 @@
6878
```python
6979
class Solution:
7080
def countBits(self, n: int) -> List[int]:
71-
dp = [0 for _ in range(n + 1)]
81+
f = [0] * (n + 1)
7282
for i in range(1, n + 1):
73-
dp[i] = dp[i & (i - 1)] + 1
74-
return dp
83+
f[i] = f[i & (i - 1)] + 1
84+
return f
7585
```
7686

7787
### **Java**
@@ -81,41 +91,52 @@ class Solution:
8191
```java
8292
class Solution {
8393
public int[] countBits(int n) {
84-
int[] dp = new int[n + 1];
85-
for (int i = 1; i <= n; i++) {
86-
dp[i] = dp[i & (i - 1)] + 1;
94+
int[] f = new int[n + 1];
95+
for (int i = 1; i <= n; ++i) {
96+
f[i] = f[i & (i - 1)] + 1;
8797
}
88-
return dp;
98+
return f;
8999
}
90100
}
91101
```
92102

103+
### **C++**
104+
105+
```cpp
106+
class Solution {
107+
public:
108+
vector<int> countBits(int n) {
109+
vector<int> f(n + 1);
110+
for (int i = 1; i <= n; ++i) {
111+
f[i] = f[i & (i - 1)] + 1;
112+
}
113+
return f;
114+
}
115+
};
116+
```
117+
93118
### **Go**
94119
95120
```go
96121
func countBits(n int) []int {
97-
dp := make([]int, n+1)
122+
f := make([]int, n+1)
98123
for i := 1; i <= n; i++ {
99-
dp[i] = dp[i&(i-1)] + 1
124+
f[i] = f[i&(i-1)] + 1
100125
}
101-
return dp
126+
return f
102127
}
103128
```
104129

105-
### **C++**
106-
107-
```cpp
108-
class Solution {
109-
public:
110-
vector<int> countBits(int n) {
111-
vector<int> res(n + 1);
112-
for (int i = 1; i <= n; i++) {
113-
res[i] = res[i & (i - 1)] + 1;
114-
}
130+
### **TypeScript**
115131

116-
return res;
132+
```ts
133+
function countBits(n: number): number[] {
134+
const f: number[] = Array(n + 1).fill(0);
135+
for (let i = 1; i <= n; ++i) {
136+
f[i] = f[i & (i - 1)] + 1;
117137
}
118-
};
138+
return f;
139+
}
119140
```
120141

121142
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
class Solution {
2-
public:
3-
vector<int> countBits(int n) {
4-
vector<int> res(n + 1);
5-
for (int i = 1; i <= n; i++) {
6-
res[i] = res[i & (i - 1)] + 1;
7-
}
8-
9-
return res;
10-
}
1+
class Solution {
2+
public:
3+
vector<int> countBits(int n) {
4+
vector<int> f(n + 1);
5+
for (int i = 1; i <= n; ++i) {
6+
f[i] = f[i & (i - 1)] + 1;
7+
}
8+
return f;
9+
}
1110
};
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
func countBits(n int) []int {
2-
dp := make([]int, n+1)
2+
f := make([]int, n+1)
33
for i := 1; i <= n; i++ {
4-
dp[i] = dp[i&(i-1)] + 1
4+
f[i] = f[i&(i-1)] + 1
55
}
6-
return dp
6+
return f
77
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
class Solution {
2-
public int[] countBits(int n) {
3-
int[] dp = new int[n + 1];
4-
for (int i = 1; i <= n; i++) {
5-
dp[i] = dp[i & (i - 1)] + 1;
6-
}
7-
return dp;
8-
}
9-
}
1+
class Solution {
2+
public int[] countBits(int n) {
3+
int[] f = new int[n + 1];
4+
for (int i = 1; i <= n; ++i) {
5+
f[i] = f[i & (i - 1)] + 1;
6+
}
7+
return f;
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
class Solution:
2-
def countBits(self, n: int) -> List[int]:
3-
dp = [0 for _ in range(n + 1)]
4-
for i in range(1, n + 1):
5-
dp[i] = dp[i & (i - 1)] + 1
6-
return dp
1+
class Solution:
2+
def countBits(self, n: int) -> List[int]:
3+
f = [0] * (n + 1)
4+
for i in range(1, n + 1):
5+
f[i] = f[i & (i - 1)] + 1
6+
return f
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function countBits(n: number): number[] {
2+
const f: number[] = Array(n + 1).fill(0);
3+
for (let i = 1; i <= n; ++i) {
4+
f[i] = f[i & (i - 1)] + 1;
5+
}
6+
return f;
7+
}

0 commit comments

Comments
 (0)