java_day2

目标: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;
    }
}

明天目标:完成3%

上一篇:day2


下一篇:Python基础知识学习——Day2