我需要找到一些具有给定常数的最大XOR的给定系列。假设是这样的:
鉴于系列:
6 7 8 9 10
给定的常数是10.带有其他给定数字的10的最大XOR是13,这是7.因此我需要找到7.
现在我遵循标准方法。问题是,当我获得100000个整数时,我的代码耗费了大量时间。有没有其他方法可以有效地找到它?
答案 0 :(得分:0)
我能想到的最快的方法就是遍历你的数字数组并用你的常数对它们进行异或,通过将它们与你之前找到的最大值进行比较来找到最大值。在找到最大数字后,再次将其与常数进行异或,以找到原始值。
Java代码:
public int findMaximumXOR(int[] nums, int constantNum)
{
int largest = nums[0] ^ constantNum;
for (int i = 1; i<nums.length; ++i)
if (largest<(nums[i] ^ constantNum))
largest = (nums[i] ^ constantNum);
return (largest ^ constantNum);
}
答案 1 :(得分:0)
让a
成为数组,q
为数字。
首先对给定数组进行排序,然后对(MAX-q)
执行二进制搜索,其中MAX
是最大可能整数(2 31 -1)。我们的想法是,当所有位与数字q
中的位相反时,exor最大。
答案 2 :(得分:0)
int L = 0, R = n-1;
for(int i = 31; i >= 0 && L < R; i--) {
if(((a[L]>>i)&1) == ((a[R]>>i)&1))
continue;
int l = L, r = R;
while(r - l > 1) {
int m = (r+l)/2;
if((a[m]>>i)&1) r = m;
else l = m;
}
if((b>>i)&1) R = l;
else L = r;
}
L
是使用数字b
最大化xor的数字的索引
a
包含按排序顺序排列的数字
答案 3 :(得分:0)
可以在这里使用树。
在输入数字时构造二叉树,MSB在顶部。
现在对于每个数字,例如1011遍历树0100 ...
如果找不到理想的赞美,可以随时妥协并继续。
答案 4 :(得分:0)
import java.util.Scanner;
public class Solution {
public static void main(String[] args) throws Exception{
Scanner in = new Scanner(System.in);
int l = in.nextInt();
int r = in.nextInt();
String ls = Integer.toBinaryString(l);
String rs = Integer.toBinaryString(r);
if (ls.length() != rs.length()) {
System.out.println((int)Math.pow(2, rs.length())-1);
return;
}
int len = ls.length();
int index=0;
for(; index < len; ++index){
if (ls.charAt(index) != rs.charAt(index))
break;
}
if (index == len) //l = r
System.out.println(0);
else
System.out.println((int)Math.pow(2, len-index)-1);
}
}