diff --git a/solution/421. Maximum XOR of Two Numbers in an Array/Solution.java b/solution/421. Maximum XOR of Two Numbers in an Array/Solution.java new file mode 100644 index 0000000000000..709e6a8d9bee5 --- /dev/null +++ b/solution/421. Maximum XOR of Two Numbers in an Array/Solution.java @@ -0,0 +1,95 @@ +import java.util.HashSet; +import java.util.Set; + +/** + *
Maximum XOR of Two Numbers in an Array(数组中两个数的最大异或值)
+ * + *题目定义 + * 给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。 + * 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n。 + * 你能在O(n)的时间解决这个问题吗? + * 示例: + * 输入: [3, 10, 5, 25, 2, 8] + * 输出: 28 + * 解释: 最大的结果是 5 ^ 25 = 28. + *
+ * + *题目分析 + * 异或运算被称为不做进位的二进制加法运算, 且具有一个性质:如果 a ^ b = c 成立,那么a ^ c = b 与 b ^ c = a 均成立。 + * 再分析一下题目, 要在数组中找到两个数对他们进行异或运算后得到一个最大的异或值, 即这个异或值二进制表示非0最高位要尽可能的靠左同时剩余位尽可能为1; + * 那两个数中必然有一个它的最高位1一定是数组中所有数转化为二进制后最高的非0位的位数; 同样我们可以找到除了第一位后的后续最优第二个; + * 我们使用贪心算法, 从高位一直往后退, 找到第一个出现非0位的数即找到第一个数, 然后再剩下的数里面找第二个数 + *
+ * @author Hinsteny + * @version Scheme: Scheme 2019-06-19 17:57 All rights reserved.$ + */ +public class Scheme { + + public static void main(String[] args) { + int[] data = {3, 10, 5, 25, 2, 8}; + int maximumXOR = findMaximumXOR(data); + System.out.println(maximumXOR); + } + + /** + * findMaximumXOR two number + * + * @param data be handle list + * @return two number + */ + private static int findMaximumXOR(int[] data) { + Set