Skip to content

Commit 7565369

Browse files
authored
feat: add solutions to lc problem: No.1611 (doocs#1486)
No.1611.Minimum One Bit Operations to Make Integers Zero
1 parent 12fe548 commit 7565369

File tree

7 files changed

+157
-62
lines changed

7 files changed

+157
-62
lines changed

solution/1600-1699/1611.Minimum One Bit Operations to Make Integers Zero/README.md

+70-24
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,29 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
**方法一:递归**
54+
**方法一:格雷码逆变换(格雷码转二进制码)**
5555

56-
通过找规律可以发现动态规划转移方程如下:
56+
本题实际上求的是格雷码为 $n$ 的逆变换,即通过格雷码构造原数。
5757

58-
$$
59-
dp[n] = dp[2^k] - dp[n - 2^k]
60-
$$
58+
我们先来回顾一下二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
6159

62-
其中 $dp[2^k] = 2^{k+1}-1$,而 $k$ 表示小于等于 $n$ 的最大的 $2$ 的整数次幂的位数,即 $2^k$ 是小于等于 $n$ 的最大的 $2$ 的整数次幂。
60+
假设某个二进制数表示为 $B_{n-1}B_{n-2}...B_2B_1B_0$,其格雷码表示为 $G_{n-1}G_{n-2}...G_2G_1G_0$。最高位保留,所以 $G_{n-1} = B_{n-1}$;而其它各位 $G_i = B_{i+1} \oplus B_{i}$,其中 $i=0,1,2..,n-2$。
61+
62+
那么,格雷码转换成二进制码的逆变换是什么呢?
63+
64+
我们可以发现,格雷码的最高位保留,所以 $B_{n-1} = G_{n-1}$;而 $B_{n-2} = G_{n-2} \oplus B_{n-1} = G_{n-2} \oplus G_{n-1}$;而其它各位 $B_i = G_{i} \oplus G_{i+1} \cdots \oplus G_{n-1}$,其中 $i=0,1,2..,n-2$。因此,我们可以用下面的函数 $rev(x)$ 得到其二进制码:
65+
66+
```java
67+
int rev(int x) {
68+
int n = 0;
69+
for (; x != 0; x >>= 1) {
70+
n ^= x;
71+
}
72+
return n;
73+
}
74+
```
75+
76+
时间复杂度 $O(\log n)$,其中 $n$ 为题目给定的整数。空间复杂度 $O(1)$。
6377

6478
<!-- tabs:start -->
6579

@@ -70,32 +84,64 @@ $$
7084
```python
7185
class Solution:
7286
def minimumOneBitOperations(self, n: int) -> int:
73-
if n <= 1:
74-
return n
75-
for i in range(64):
76-
if (n >> i) == 1:
77-
base = 1 << i
78-
break
79-
return 2 * base - 1 - self.minimumOneBitOperations(n - base)
87+
ans = 0
88+
while n:
89+
ans ^= n
90+
n >>= 1
91+
return ans
8092
```
8193

8294
### **Go**
8395

8496
<!-- 这里可写当前语言的特殊实现逻辑 -->
8597

98+
```java
99+
class Solution {
100+
public int minimumOneBitOperations(int n) {
101+
int ans = 0;
102+
for (; n > 0; n >>= 1) {
103+
ans ^= n;
104+
}
105+
return ans;
106+
}
107+
}
108+
```
109+
110+
### **C++**
111+
112+
```cpp
113+
class Solution {
114+
public:
115+
int minimumOneBitOperations(int n) {
116+
int ans = 0;
117+
for (; n > 0; n >>= 1) {
118+
ans ^= n;
119+
}
120+
return ans;
121+
}
122+
};
123+
```
124+
125+
### **Go**
126+
86127
```go
87-
func minimumOneBitOperations(n int) int {
88-
if n <= 1 {
89-
return n
90-
}
91-
base := 0
92-
for i := 0; i < 64; i++ {
93-
if (n >> i) == 1 {
94-
base = 1 << i
95-
break
96-
}
128+
func minimumOneBitOperations(n int) (ans int) {
129+
for ; n > 0; n >>= 1 {
130+
ans ^= n
97131
}
98-
return (base << 1) - 1 - minimumOneBitOperations(n-base)
132+
return
133+
}
134+
```
135+
136+
### **TypeScript**
137+
138+
```ts
139+
function minimumOneBitOperations(n: number): number {
140+
let ans = 0;
141+
for (; n > 0; n >>= 1) {
142+
ans ^= n;
143+
}
144+
return ans;
99145
}
100146
```
101147

solution/1600-1699/1611.Minimum One Bit Operations to Make Integers Zero/README_EN.md

+50-18
Original file line numberDiff line numberDiff line change
@@ -52,30 +52,62 @@
5252
```python
5353
class Solution:
5454
def minimumOneBitOperations(self, n: int) -> int:
55-
if n <= 1:
56-
return n
57-
for i in range(64):
58-
if (n >> i) == 1:
59-
base = 1 << i
60-
break
61-
return 2 * base - 1 - self.minimumOneBitOperations(n - base)
55+
ans = 0
56+
while n:
57+
ans ^= n
58+
n >>= 1
59+
return ans
60+
```
61+
62+
### **Java**
63+
64+
```java
65+
class Solution {
66+
public int minimumOneBitOperations(int n) {
67+
int ans = 0;
68+
for (; n > 0; n >>= 1) {
69+
ans ^= n;
70+
}
71+
return ans;
72+
}
73+
}
74+
```
75+
76+
### **C++**
77+
78+
```cpp
79+
class Solution {
80+
public:
81+
int minimumOneBitOperations(int n) {
82+
int ans = 0;
83+
for (; n > 0; n >>= 1) {
84+
ans ^= n;
85+
}
86+
return ans;
87+
}
88+
};
6289
```
6390
6491
### **Go**
6592
6693
```go
67-
func minimumOneBitOperations(n int) int {
68-
if n <= 1 {
69-
return n
94+
func minimumOneBitOperations(n int) (ans int) {
95+
for ; n > 0; n >>= 1 {
96+
ans ^= n
7097
}
71-
base := 0
72-
for i := 0; i < 64; i++ {
73-
if (n >> i) == 1 {
74-
base = 1 << i
75-
break
76-
}
77-
}
78-
return (base << 1) - 1 - minimumOneBitOperations(n-base)
98+
return
99+
}
100+
```
101+
102+
### **TypeScript**
103+
104+
```ts
105+
function minimumOneBitOperations(n: number): number {
106+
let ans = 0;
107+
for (; n > 0; n >>= 1) {
108+
ans ^= n;
109+
}
110+
return ans;
79111
}
80112
```
81113

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution {
2+
public:
3+
int minimumOneBitOperations(int n) {
4+
int ans = 0;
5+
for (; n > 0; n >>= 1) {
6+
ans ^= n;
7+
}
8+
return ans;
9+
}
10+
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
func minimumOneBitOperations(n int) int {
2-
if n <= 1 {
3-
return n
1+
func minimumOneBitOperations(n int) (ans int) {
2+
for ; n > 0; n >>= 1 {
3+
ans ^= n
44
}
5-
base := 0
6-
for i := 0; i < 64; i++ {
7-
if (n >> i) == 1 {
8-
base = 1 << i
9-
break
10-
}
11-
}
12-
return (base << 1) - 1 - minimumOneBitOperations(n-base)
5+
return
136
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
public int minimumOneBitOperations(int n) {
3+
int ans = 0;
4+
for (; n > 0; n >>= 1) {
5+
ans ^= n;
6+
}
7+
return ans;
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
class Solution:
2-
def minimumOneBitOperations(self, n: int) -> int:
3-
if n <= 1:
4-
return n
5-
for i in range(64):
6-
if (n >> i) == 1:
7-
base = 1 << i
8-
break
9-
return 2 * base - 1 - self.minimumOneBitOperations(n - base)
1+
class Solution:
2+
def minimumOneBitOperations(self, n: int) -> int:
3+
ans = 0
4+
while n:
5+
ans ^= n
6+
n >>= 1
7+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function minimumOneBitOperations(n: number): number {
2+
let ans = 0;
3+
for (; n > 0; n >>= 1) {
4+
ans ^= n;
5+
}
6+
return ans;
7+
}

0 commit comments

Comments
 (0)