面试算法67:最大的异或

题目

输入一个整数数组(每个数字都大于或等于0),请计算其中任意两个数字的异或的最大值。例如,在数组[1,3,4,7]中,3和4的异或结果最大,异或结果为7。

分析

整数的异或有一个特点,如果两个相同数位异或的结果是0,那么两个相反的数位异或的结果为1。如果想找到某个整数k和其他整数的最大异或值,那么尽量找和k的数位不同的整数。
因此,这个问题可以转化为查找的问题,而且还是按照整数的二进制数位进行查找的问题。需要将整数的每个数位都保存下来。前缀树可以实现这种思路,前缀树的每个节点对应整数的一个数位,路径对应一个整数。

public class Test {
   
    public static void main(String[] args) {
   
        int[] dict = {
   1, 3, 4, 7};
        System.out.println(findMaximumXOR(dict));
    }

    static class TrieNode {
   
        public TrieNode[] children;

        public TrieNode() {
   
            children = new TrieNode[2];
        }
    }

    private static TrieNode buildTrie(int[] nums) {
   
        TrieNode root = new TrieNode();
        for (int num : nums) {
   
            TrieNode node = root;
            for (int i = 31; i >= 0; i--) {
   // 先保存高位
                int bit = (num >> i) & 1;
                if (node.children[bit] == null) {
   
                    node.children[bit] = new TrieNode();
                }

                node = node.children[bit];
            }
        }

        return root;
    }

    public static int findMaximumXOR(int[] nums) {
   
        TrieNode root = buildTrie(nums);
        int max = 0;
        for (int num : nums) {
   
            TrieNode node = root;
            int xor = 0;
            for (int i = 31; i >= 0; i--) {
   // 从高位开始比较
                int bit = (num >> i) & 1;
                if (node.children[1 - bit] != null) {
   // 存在和bit不一样的bit
                    xor = (xor << 1) + 1;
                    node = node.children[1 - bit];
                }
                else {
   
                    xor = xor << 1;
                    node = node.children[bit];
                }
            }

            max = Math.max(max, xor);
        }
        return max;
    }
}

相关推荐

  1. 面试算法67

    2023-12-22 09:24:02       54 阅读
  2. 算法刷题笔记 对(详细注释C++实现)

    2023-12-22 09:24:02       26 阅读
  3. (67)动态口令 (68)解码数组

    2023-12-22 09:24:02       43 阅读
  4. Acwing143

    2023-12-22 09:24:02       49 阅读
  5. 26、

    2023-12-22 09:24:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 09:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 09:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 09:24:02       82 阅读
  4. Python语言-面向对象

    2023-12-22 09:24:02       91 阅读

热门阅读

  1. 蓝桥杯-每日刷题-024

    2023-12-22 09:24:02       49 阅读
  2. API文档生成工具-----Knife4介绍

    2023-12-22 09:24:02       77 阅读
  3. Liunx服务器查看程序的日志命令

    2023-12-22 09:24:02       49 阅读
  4. Ceph基本环境配置

    2023-12-22 09:24:02       64 阅读
  5. LeetCode 每日一题 Day 19 || 前后缀和分解&单调栈

    2023-12-22 09:24:02       70 阅读
  6. ImageProcessing,ComputerVision,DeepLearning中的名词

    2023-12-22 09:24:02       61 阅读
  7. LVS虚拟服务器

    2023-12-22 09:24:02       65 阅读