Skip to content

Commit f1f9361

Browse files
committed
Add Solution.java for 421.Maximum XOR of Two Numbers in an Array
1 parent 200c45e commit f1f9361

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
## ๆ•ฐ็ป„ไธญไธคไธชๆ•ฐ็š„ๆœ€ๅคงๅผ‚ๆˆ–ๅ€ผ
2+
### ้ข˜็›ฎๆ่ฟฐ
3+
4+
็ป™ๅฎšไธ€ไธช้ž็ฉบๆ•ฐ็ป„๏ผŒๆ•ฐ็ป„ไธญๅ…ƒ็ด ไธบ a0, a1, a2, โ€ฆ , an-1๏ผŒๅ…ถไธญ 0 โ‰ค ai < 231ย ใ€‚
5+
6+
ๆ‰พๅˆฐ ai ๅ’Œajย ๆœ€ๅคง็š„ๅผ‚ๆˆ– (XOR) ่ฟ็ฎ—็ป“ๆžœ๏ผŒๅ…ถไธญ0 โ‰ค i,ย ย j < nย ใ€‚
7+
8+
็คบไพ‹:
9+
```
10+
่พ“ๅ…ฅ: [3, 10, 5, 25, 2, 8]
11+
12+
่พ“ๅ‡บ: 28
13+
14+
่งฃ้‡Š: ๆœ€ๅคง็š„็ป“ๆžœๆ˜ฏ 5 ^ 25 = 28.
15+
```
16+
17+
### ่งฃๆณ•
18+
ๅผ‚ๆˆ–่ฟ็ฎ—่ขซ็งฐไธบไธๅš่ฟ›ไฝ็š„ไบŒ่ฟ›ๅˆถๅŠ ๆณ•่ฟ็ฎ—, ไธ”ๅ…ทๆœ‰ไธ€ไธชๆ€ง่ดจ๏ผšๅฆ‚ๆžœ a ^ b = c ๆˆ็ซ‹๏ผŒ้‚ฃไนˆa ^ c = b ไธŽ b ^ c = a ๅ‡ๆˆ็ซ‹ใ€‚
19+
ๅ†ๅˆ†ๆžไธ€ไธ‹้ข˜็›ฎ, ่ฆๅœจๆ•ฐ็ป„ไธญๆ‰พๅˆฐไธคไธชๆ•ฐๅฏนไป–ไปฌ่ฟ›่กŒๅผ‚ๆˆ–่ฟ็ฎ—ๅŽๅพ—ๅˆฐไธ€ไธชๆœ€ๅคง็š„ๅผ‚ๆˆ–ๅ€ผ, ๅณ่ฟ™ไธชๅผ‚ๆˆ–ๅ€ผไบŒ่ฟ›ๅˆถ่กจ็คบ้ž0ๆœ€้ซ˜ไฝ่ฆๅฐฝๅฏ่ƒฝ็š„้ ๅทฆๅŒๆ—ถๅ‰ฉไฝ™ไฝๅฐฝๅฏ่ƒฝไธบ1;
20+
ๆ•ดไฝ“ไฝฟ็”จ่ดชๅฟƒๅŽŸๅˆ™, ไพๆฌกๅ‡่ฎพๆ•ดๆ•ฐไปŽๅทฆ่‡ณๅณ็ฌฌiไธบ1, ็„ถๅŽๅ†ไฝฟ็”จไธ€ไธชmaskไธŽๆ•ฐ็ป„ไธญๆ‰€ๆœ‰ๆ•ฐ็›ธไธŽๅพ—ๅˆฐๆ•ฐๆฎๅ‰iไฝ็š„ไธ€ไธชๅ‰็ผ€้›†ๅˆ, ๅ†ๆŠŠไน‹ๅ‰ไธ€ๆฌกi-1ๅพช็Žฏๆ‰€ๅพ—ๅˆฐ็š„maxๅŠ ็ฌฌiไฝ
21+
ไธบ1ๅพ—ๅˆฐๅฝ“ๅ‰iๅพช็ŽฏไธญๆœŸๆœ›็š„pre-max, ๅ†ไธŽๅ‰็ผ€้›†ๅˆไธญ็š„ๆ‰€ๆœ‰ๆ•ฐ่ฟ›่กŒๅผ‚ๆˆ–่ฟ็ฎ—, ๅฆ‚ๆžœๅพ—ๅˆฐ็š„ๅ€ผไนŸๅŒๆ—ถๅœจ้›†ๅˆไธญ, ่กจ็คบๅ‡่ฎพๆˆ็ซ‹, maxๅ˜ไธบpre-max, ๅฆๅˆ™็›ดๆŽฅi+1่ฟ›่กŒไธ‹ไธ€ไธช
22+
ๅพช็Žฏ, ็›ดๅˆฐi=0็ฎ—ๆณ•็ป“ๆŸ;
23+
24+
```java
25+
class Solution {
26+
27+
public int findMaximumXOR(int[] numbers) {
28+
int max = 0;
29+
int mask = 0;
30+
for (int i = 30; i >= 0; i--) {
31+
int current = 1 << i;
32+
// ๆœŸๆœ›็š„ไบŒ่ฟ›ๅˆถๅ‰็ผ€
33+
mask = mask ^ current;
34+
// ๅœจๅฝ“ๅ‰ๅ‰็ผ€ไธ‹, ๆ•ฐ็ป„ๅ†…็š„ๅ‰็ผ€ไฝๆ•ฐๆ‰€ๆœ‰ๆƒ…ๅ†ต้›†ๅˆ
35+
Set<Integer> set = new HashSet<>();
36+
for (int j = 0, k = numbers.length; j < k; j++) {
37+
set.add(mask & numbers[j]);
38+
}
39+
// ๆœŸๆœ›ๆœ€็ปˆๅผ‚ๆˆ–ๅ€ผ็š„ไปŽๅณๆ•ฐ็ฌฌiไฝไธบ1, ๅ†ๆ นๆฎๅผ‚ๆˆ–่ฟ็ฎ—็š„็‰นๆ€งๆŽจ็ฎ—ๅ‡่ฎพๆ˜ฏๅฆๆˆ็ซ‹
40+
int flag = max | current;
41+
for (Integer prefix : set) {
42+
if (set.contains(prefix ^ flag)) {
43+
max = flag;
44+
break;
45+
}
46+
}
47+
}
48+
return max;
49+
}
50+
}
51+
```
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
3+
public int findMaximumXOR(int[] numbers) {
4+
int max = 0;
5+
int mask = 0;
6+
for (int i = 30; i >= 0; i--) {
7+
int current = 1 << i;
8+
// ๆœŸๆœ›็š„ไบŒ่ฟ›ๅˆถๅ‰็ผ€
9+
mask = mask ^ current;
10+
// ๅœจๅฝ“ๅ‰ๅ‰็ผ€ไธ‹, ๆ•ฐ็ป„ๅ†…็š„ๅ‰็ผ€ไฝๆ•ฐๆ‰€ๆœ‰ๆƒ…ๅ†ต้›†ๅˆ
11+
Set<Integer> set = new HashSet<>();
12+
for (int j = 0, k = numbers.length; j < k; j++) {
13+
set.add(mask & numbers[j]);
14+
}
15+
// ๆœŸๆœ›ๆœ€็ปˆๅผ‚ๆˆ–ๅ€ผ็š„ไปŽๅณๆ•ฐ็ฌฌiไฝไธบ1, ๅ†ๆ นๆฎๅผ‚ๆˆ–่ฟ็ฎ—็š„็‰นๆ€งๆŽจ็ฎ—ๅ‡่ฎพๆ˜ฏๅฆๆˆ็ซ‹
16+
int flag = max | current;
17+
for (Integer prefix : set) {
18+
if (set.contains(prefix ^ flag)) {
19+
max = flag;
20+
break;
21+
}
22+
}
23+
}
24+
return max;
25+
}
26+
}

โ€Žsolution/README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,9 @@
765765
โ”‚ย ย  โ””โ”€โ”€ Solution.py
766766
โ”œโ”€โ”€ 0415.Add Strings
767767
โ”‚ย ย  โ””โ”€โ”€ Solution.java
768+
โ”œโ”€โ”€ 0421.Maximum XOR of Two Numbers in an Array
769+
โ”‚ย ย  โ”œโ”€โ”€ README.md
770+
โ”‚ย ย  โ””โ”€โ”€ Solution.java
768771
โ”œโ”€โ”€ 0423.Reconstruct Original Digits from English
769772
โ”‚ย ย  โ””โ”€โ”€ Solution.cpp
770773
โ”œโ”€โ”€ 0427.Construct Quad Tree
@@ -1056,4 +1059,4 @@
10561059
โ”‚ย ย  โ””โ”€โ”€ Solution.py
10571060
โ””โ”€โ”€ 5087.Letter Tile Possibilities
10581061
โ””โ”€โ”€ Solution.py
1059-
```
1062+
```

0 commit comments

Comments
ย (0)