Skip to content

Commit 125b165

Browse files
committed
feat: add solutions to lc problem: No.2429
1 parent 1337448 commit 125b165

File tree

9 files changed

+134
-253
lines changed

9 files changed

+134
-253
lines changed

solution/2400-2499/2429.Minimize XOR/README.md

Lines changed: 44 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ num1 和 num2 的二进制表示分别是 0001 和 1100 。
7070

7171
### 方法一:贪心 + 位运算
7272

73-
根据题目描述,我们先求出 $num2$ 的置位数 $cnt$,然后从高位到低位枚举 $num1$ 的每一位,如果该位为 $1$,则将 $x$ 的对应位设为 $1$,并将 $cnt$ 减 $1$,直到 $cnt$ 为 $0$。如果此时 $cnt$ 仍不为 $0$,则从低位开始将 $num1$ 的每一位为 $0$ 的位置设为 $1$,并将 $cnt$ 减 $1$,直到 $cnt$ 为 $0$。
73+
根据题目描述,我们先求出 $\textit{nums2}$ 的置位数 $\textit{cnt}$,然后从高位到低位枚举 $\textit{num1}$ 的每一位,如果该位为 $1$,则将 $x$ 的对应位设为 $1$,并将 $\textit{cnt}$ 减 $1$,直到 $\textit{cnt}$ 为 $0$。如果此时 $\textit{cnt}$ 仍不为 $0$,则从低位开始将 $\textit{num1}$ 的每一位为 $0$ 的位置设为 $1$,并将 $\textit{cnt}$ 减 $1$,直到 $\textit{cnt}$ 为 $0$。
7474

75-
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为 $num1$ 和 $num2$ 的最大值。
75+
时间复杂度 $O(\log n)$,其中 $n$ 为 $\textit{num1}$ 和 $\textit{num2}$ 的最大值。空间复杂度 $O(1)$
7676

7777
<!-- tabs:start -->
7878

@@ -191,107 +191,59 @@ function minimizeXor(num1: number, num2: number): number {
191191
}
192192
```
193193

194-
<!-- tabs:end -->
195-
196-
<!-- solution:end -->
197-
198-
<!-- solution:start -->
199-
200-
### 方法二
201-
202-
<!-- tabs:start -->
194+
#### Rust
203195

204-
#### Python3
205-
206-
```python
207-
class Solution:
208-
def minimizeXor(self, num1: int, num2: int) -> int:
209-
cnt1 = num1.bit_count()
210-
cnt2 = num2.bit_count()
211-
while cnt1 > cnt2:
212-
num1 &= num1 - 1
213-
cnt1 -= 1
214-
while cnt1 < cnt2:
215-
num1 |= num1 + 1
216-
cnt1 += 1
217-
return num1
218-
```
219-
220-
#### Java
221-
222-
```java
223-
class Solution {
224-
public int minimizeXor(int num1, int num2) {
225-
int cnt1 = Integer.bitCount(num1);
226-
int cnt2 = Integer.bitCount(num2);
227-
for (; cnt1 > cnt2; --cnt1) {
228-
num1 &= (num1 - 1);
196+
```rust
197+
impl Solution {
198+
pub fn minimize_xor(num1: i32, mut num2: i32) -> i32 {
199+
let mut cnt = 0;
200+
while num2 > 0 {
201+
num2 -= num2 & -num2;
202+
cnt += 1;
229203
}
230-
for (; cnt1 < cnt2; ++cnt1) {
231-
num1 |= (num1 + 1);
204+
let mut x = 0;
205+
let mut c = cnt;
206+
for i in (0..=30).rev() {
207+
if c > 0 && (num1 >> i) & 1 == 1 {
208+
x |= 1 << i;
209+
c -= 1;
210+
}
232211
}
233-
return num1;
212+
for i in 0..=30 {
213+
if c == 0 {
214+
break;
215+
}
216+
if ((num1 >> i) & 1) == 0 {
217+
x |= 1 << i;
218+
c -= 1;
219+
}
220+
}
221+
x
234222
}
235223
}
236224
```
237225

238-
#### C++
226+
#### C#
239227

240-
```cpp
241-
class Solution {
242-
public:
243-
int minimizeXor(int num1, int num2) {
244-
int cnt1 = __builtin_popcount(num1);
245-
int cnt2 = __builtin_popcount(num2);
246-
for (; cnt1 > cnt2; --cnt1) {
247-
num1 &= (num1 - 1);
228+
```cs
229+
public class Solution {
230+
public int MinimizeXor(int num1, int num2) {
231+
int cnt = BitOperations.PopCount((uint)num2);
232+
int x = 0;
233+
for (int i = 30; i >= 0 && cnt > 0; --i) {
234+
if (((num1 >> i) & 1) == 1) {
235+
x |= 1 << i;
236+
--cnt;
237+
}
248238
}
249-
for (; cnt1 < cnt2; ++cnt1) {
250-
num1 |= (num1 + 1);
239+
for (int i = 0; cnt > 0; ++i) {
240+
if (((num1 >> i) & 1) == 0) {
241+
x |= 1 << i;
242+
--cnt;
243+
}
251244
}
252-
return num1;
253-
}
254-
};
255-
```
256-
257-
#### Go
258-
259-
```go
260-
func minimizeXor(num1 int, num2 int) int {
261-
cnt1 := bits.OnesCount(uint(num1))
262-
cnt2 := bits.OnesCount(uint(num2))
263-
for ; cnt1 > cnt2; cnt1-- {
264-
num1 &= (num1 - 1)
265-
}
266-
for ; cnt1 < cnt2; cnt1++ {
267-
num1 |= (num1 + 1)
268-
}
269-
return num1
270-
}
271-
```
272-
273-
#### TypeScript
274-
275-
```ts
276-
function minimizeXor(num1: number, num2: number): number {
277-
let cnt1 = bitCount(num1);
278-
let cnt2 = bitCount(num2);
279-
for (; cnt1 > cnt2; --cnt1) {
280-
num1 &= num1 - 1;
281-
}
282-
for (; cnt1 < cnt2; ++cnt1) {
283-
num1 |= num1 + 1;
245+
return x;
284246
}
285-
return num1;
286-
}
287-
288-
function bitCount(i: number): number {
289-
i = i - ((i >>> 1) & 0x55555555);
290-
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
291-
i = (i + (i >>> 4)) & 0x0f0f0f0f;
292-
i = i + (i >>> 8);
293-
i = i + (i >>> 16);
294-
return i & 0x3f;
295247
}
296248
```
297249

solution/2400-2499/2429.Minimize XOR/README_EN.md

Lines changed: 44 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ The integer <strong>3</strong> has the same number of set bits as num2, and the
6868

6969
### Solution 1: Greedy + Bit Manipulation
7070

71-
According to the problem description, we first calculate the number of set bits $cnt$ in $num2$, then enumerate each bit of $num1$ from high to low. If the bit is $1$, we set the corresponding bit in $x$ to $1$ and decrement $cnt$ by $1$, until $cnt$ is $0$. If $cnt$ is still not $0$ at this point, we start from the low bit and set each bit of $num1$ that is $0$ to $1$, and decrement $cnt$ by $1$, until $cnt$ is $0$.
71+
According to the problem description, we first calculate the number of set bits in $\textit{num2}$, denoted as $\textit{cnt}$. Then, we iterate from the highest to the lowest bit of $\textit{num1}$; if the current bit is $1$, we set the corresponding bit in $x$ to $1$ and decrement $\textit{cnt}$, until $\textit{cnt}$ becomes $0$. If $\textit{cnt}$ is still not $0$, we iterate from the lowest bit upwards, setting positions where $\textit{num1}$ has $0$ to $1$ in $x$, and decrement $\textit{cnt}$ until it reaches $0$.
7272

73-
The time complexity is $O(\log n)$, and the space complexity is $O(1)$. Here, $n$ is the maximum value of $num1$ and $num2$.
73+
The time complexity is $O(\log n)$, where $n$ is the maximum value of $\textit{num1}$ and $\textit{num2}$. The space complexity is $O(1)$.
7474

7575
<!-- tabs:start -->
7676

@@ -189,107 +189,59 @@ function minimizeXor(num1: number, num2: number): number {
189189
}
190190
```
191191

192-
<!-- tabs:end -->
193-
194-
<!-- solution:end -->
195-
196-
<!-- solution:start -->
197-
198-
### Solution 2
199-
200-
<!-- tabs:start -->
192+
#### Rust
201193

202-
#### Python3
203-
204-
```python
205-
class Solution:
206-
def minimizeXor(self, num1: int, num2: int) -> int:
207-
cnt1 = num1.bit_count()
208-
cnt2 = num2.bit_count()
209-
while cnt1 > cnt2:
210-
num1 &= num1 - 1
211-
cnt1 -= 1
212-
while cnt1 < cnt2:
213-
num1 |= num1 + 1
214-
cnt1 += 1
215-
return num1
216-
```
217-
218-
#### Java
219-
220-
```java
221-
class Solution {
222-
public int minimizeXor(int num1, int num2) {
223-
int cnt1 = Integer.bitCount(num1);
224-
int cnt2 = Integer.bitCount(num2);
225-
for (; cnt1 > cnt2; --cnt1) {
226-
num1 &= (num1 - 1);
194+
```rust
195+
impl Solution {
196+
pub fn minimize_xor(num1: i32, mut num2: i32) -> i32 {
197+
let mut cnt = 0;
198+
while num2 > 0 {
199+
num2 -= num2 & -num2;
200+
cnt += 1;
227201
}
228-
for (; cnt1 < cnt2; ++cnt1) {
229-
num1 |= (num1 + 1);
202+
let mut x = 0;
203+
let mut c = cnt;
204+
for i in (0..=30).rev() {
205+
if c > 0 && (num1 >> i) & 1 == 1 {
206+
x |= 1 << i;
207+
c -= 1;
208+
}
230209
}
231-
return num1;
210+
for i in 0..=30 {
211+
if c == 0 {
212+
break;
213+
}
214+
if ((num1 >> i) & 1) == 0 {
215+
x |= 1 << i;
216+
c -= 1;
217+
}
218+
}
219+
x
232220
}
233221
}
234222
```
235223

236-
#### C++
224+
#### C#
237225

238-
```cpp
239-
class Solution {
240-
public:
241-
int minimizeXor(int num1, int num2) {
242-
int cnt1 = __builtin_popcount(num1);
243-
int cnt2 = __builtin_popcount(num2);
244-
for (; cnt1 > cnt2; --cnt1) {
245-
num1 &= (num1 - 1);
226+
```cs
227+
public class Solution {
228+
public int MinimizeXor(int num1, int num2) {
229+
int cnt = BitOperations.PopCount((uint)num2);
230+
int x = 0;
231+
for (int i = 30; i >= 0 && cnt > 0; --i) {
232+
if (((num1 >> i) & 1) == 1) {
233+
x |= 1 << i;
234+
--cnt;
235+
}
246236
}
247-
for (; cnt1 < cnt2; ++cnt1) {
248-
num1 |= (num1 + 1);
237+
for (int i = 0; cnt > 0; ++i) {
238+
if (((num1 >> i) & 1) == 0) {
239+
x |= 1 << i;
240+
--cnt;
241+
}
249242
}
250-
return num1;
251-
}
252-
};
253-
```
254-
255-
#### Go
256-
257-
```go
258-
func minimizeXor(num1 int, num2 int) int {
259-
cnt1 := bits.OnesCount(uint(num1))
260-
cnt2 := bits.OnesCount(uint(num2))
261-
for ; cnt1 > cnt2; cnt1-- {
262-
num1 &= (num1 - 1)
263-
}
264-
for ; cnt1 < cnt2; cnt1++ {
265-
num1 |= (num1 + 1)
266-
}
267-
return num1
268-
}
269-
```
270-
271-
#### TypeScript
272-
273-
```ts
274-
function minimizeXor(num1: number, num2: number): number {
275-
let cnt1 = bitCount(num1);
276-
let cnt2 = bitCount(num2);
277-
for (; cnt1 > cnt2; --cnt1) {
278-
num1 &= num1 - 1;
279-
}
280-
for (; cnt1 < cnt2; ++cnt1) {
281-
num1 |= num1 + 1;
243+
return x;
282244
}
283-
return num1;
284-
}
285-
286-
function bitCount(i: number): number {
287-
i = i - ((i >>> 1) & 0x55555555);
288-
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
289-
i = (i + (i >>> 4)) & 0x0f0f0f0f;
290-
i = i + (i >>> 8);
291-
i = i + (i >>> 16);
292-
return i & 0x3f;
293245
}
294246
```
295247

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public class Solution {
2+
public int MinimizeXor(int num1, int num2) {
3+
int cnt = BitOperations.PopCount((uint)num2);
4+
int x = 0;
5+
for (int i = 30; i >= 0 && cnt > 0; --i) {
6+
if (((num1 >> i) & 1) == 1) {
7+
x |= 1 << i;
8+
--cnt;
9+
}
10+
}
11+
for (int i = 0; cnt > 0; ++i) {
12+
if (((num1 >> i) & 1) == 0) {
13+
x |= 1 << i;
14+
--cnt;
15+
}
16+
}
17+
return x;
18+
}
19+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
impl Solution {
2+
pub fn minimize_xor(num1: i32, mut num2: i32) -> i32 {
3+
let mut cnt = 0;
4+
while num2 > 0 {
5+
num2 -= num2 & -num2;
6+
cnt += 1;
7+
}
8+
let mut x = 0;
9+
let mut c = cnt;
10+
for i in (0..=30).rev() {
11+
if c > 0 && (num1 >> i) & 1 == 1 {
12+
x |= 1 << i;
13+
c -= 1;
14+
}
15+
}
16+
for i in 0..=30 {
17+
if c == 0 {
18+
break;
19+
}
20+
if ((num1 >> i) & 1) == 0 {
21+
x |= 1 << i;
22+
c -= 1;
23+
}
24+
}
25+
x
26+
}
27+
}

solution/2400-2499/2429.Minimize XOR/Solution2.cpp

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)