【发布时间】:2012-02-10 05:17:05
【问题描述】:
我需要你找到一些给定的系列,这些系列与给定的常数具有最大的异或。假设这样:
给定系列:
6 7 8 9 10
给定的常数是 10。10 与其他给定数字的最大异或是 13,即 7。所以我需要找到 7。
现在我遵循标准方法。问题是当我得到 100000 个整数时,我的代码占用了很多时间。有没有其他方法可以有效地找出这个问题?
【问题讨论】:
我需要你找到一些给定的系列,这些系列与给定的常数具有最大的异或。假设这样:
给定系列:
6 7 8 9 10
给定的常数是 10。10 与其他给定数字的最大异或是 13,即 7。所以我需要找到 7。
现在我遵循标准方法。问题是当我得到 100000 个整数时,我的代码占用了很多时间。有没有其他方法可以有效地找出这个问题?
【问题讨论】:
我能想到的最快方法是遍历您的数字数组并将它们与您的常数进行异或,通过将它们与您之前找到的最大值进行比较来找到最大值。找到最大数后,只需将其与您的常数再次异或即可找到原始值。
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);
}
【讨论】:
设a 为数组,q 为数字。
您首先对给定数组进行排序,然后对 (MAX-q) 执行二进制搜索,其中 MAX 是可能的最大整数 (231-1)。这个想法是,当所有位与数字q 中的位相反时,exor 最大。
【讨论】:
这里可以使用一棵树。
在输入数字时构造一棵二叉树,MSB 在顶部。
现在对于每个数字,例如 1011 遍历树 0100...
在任何时候,如果没有找到理想的恭维,就可以妥协并继续。
【讨论】:
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);
}
}
【讨论】:
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 进行异或最大化的数字的索引,而
a 包含按排序顺序排列的数字
【讨论】: