目标:Java web开发
直至今天,完成度:2%
给定你一个有约十万个数的整数数列,每个整数大于等于0小于等于20亿。
请你在1秒内算出,任选两个数进行异或运算得到结果的最大值。
输入样例(10个数时):
10
181262 369842 1036879 546331 868986 496157 646816 459571 215643 448018
输出样例:
1033222
import java.util.*;
public class Main{//记得要加static修饰,变量和函数不加static修饰是不会作用的
static int[] a;
static int[][] son;//建造huffman树,节点为index
static int idx;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
a=new int[n];
son=new int[31*n][2];
int res=0;
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
insert(a[i]);
res=Math.max(res,find(a[i]));
/*今天,我学会了几个Math函数
Math.sqrt() : 计算平方根
Math.max( , ) : 计算最大值
Math.min( , ) : 计算最小值
Math.abs() : 取绝对值
Math.ceil(): 返回double类型,向数值较大的方向取整
Math.floor() : 返回double类型,向数值较小的方向取整
*/
}
/*当然,上面的for循环以及for循环里面的函数也可以用两层for循环代替
前提是你能忍受十分钟的运行时间。
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++) res=Math.max(res,a[i]^a[j]);
*/
System.out.print(res);
}
public static void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[p][u]==0) son[p][u]=++idx;
//这里不能直接写int型的son[p][u],if()里的只能是boolean型
p=son[p][u];
}
}
public static int find(int x){
int p=0,k=0;
for(int i=30;i>=0;i--){
int u=x>>i&1,v=u^1;
if(son[p][v]!=0){
k=(k<<1)+v;
p=son[p][v];
}
else{
k=(k<<1)+u;
p=son[p][u];
}
}
return k^x;
}
}