最大异或和计算 | 豆包MarsCode AI刷题

119 阅读3分钟

问题描述

给定两个长度为 n 的数组 a 和 b,定义 f(c) 为数组 c 的所有元素的总和。现在,你需要恰好删除数组 a 或者数组 b 中的一个元素,使得 f(a) 和 f(b) 的异或结果最大。请输出这个最大的异或和。


测试样例

样例1:

输入:n = 3,a = [1, 2, 3],b = [3, 2, 1]
输出:5

样例2:

输入:n = 4,a = [4, 5, 6, 7],b = [7, 8, 9, 10]
输出:51

样例3:

输入:n = 5,a = [10, 20, 30, 40, 50],b = [50, 40, 30, 20, 10]
输出:248

问题分析

  1. 异或运算简介

    • 异或运算是一种常见的位运算,其规则为:

      • 如果两个二进制位相同,结果为 0;
      • 如果两个二进制位不同,结果为 1。
      • 异或运算遵循以下基本规则:
      • 1 ⊕ 1 = 0
      • 0 ⊕ 0 = 0
      • 1 ⊕ 0 = 1
      • 0 ⊕ 1 = 1
    • 异或运算具有以下几个重要性质:

      • 归零律:任何数与自身异或等于0,即 X ⊕ X = 0。
      • 恒等律:任何数与0异或等于其自身,即 X ⊕ 0 = X。
      • 交换律:X ⊕ Y = Y ⊕ X。
      • 结合律:X ⊕ (Y ⊕ Z) = (X ⊕ Y) ⊕ Z。
      • 自反性:对于任何数X和Y,有 X ⊕ Y ⊕ Y = X。
  2. 问题转化

    • 我们需要计算两个数组的总和 sum (a) 和 sum(b)。

    • 然后从 a 或 b 中删除一个元素,形成新数组,其对应异或和取最大值

  3. 暴力解法

    • 枚举每种可能的删除方式:

      • 遍历 a 中的每个元素,计算删除后的异或值。
      • 遍历 b 中的每个元素,计算删除后的异或值。
    • 取最大值作为结果。

解决方案

以下是 Python 代码的实现:

def solution(n: int, a: list, b: list) -> int:
    sum_a = sum(a)
    sum_b = sum(b)
    # 初始的 XOR 值
    max_xor = float('-inf')
    # 尝试从 a 中删除一个元素
    for num in a:
        new_xor = (sum_a - num) ^ sum_b
        max_xor = max(max_xor, new_xor)
    # 尝试从 b 中删除一个元素
    for num in b:
        new_xor = sum_a ^ (sum_b - num)
        max_xor = max(max_xor, new_xor)
    return max_xor


if __name__ == '__main__':
    print(solution(3, [1, 2, 3], [3, 2, 1]) == 5)
    print(solution(4, [4, 5, 6, 7], [7, 8, 9, 10]) == 51)
    print(solution(5, [10, 20, 30, 40, 50], [50, 40, 30, 20, 10]) == 248)

复杂度分析

  1. 时间复杂度

    • 遍历 a 和 b 各需要 O(n) 时间。
  2. 空间复杂度

    • 使用了常量空间存储中间变量,复杂度为 O(1)。

知识点总结

  1. 异或运算的灵活应用

    • 值交换:不使用额外变量交换两个变量的值,即 a = a ⊕ b; b = a ⊕ b; a = a ⊕ b。
    • 奇偶校验:判断二进制数中1的数量是奇数还是偶数。
    • 数据加密:由于异或运算的自反性,可以用于简单的加密和解密过程。
    • 错误检测与纠正:在数据传输过程中,异或运算可以用于生成校验位,以检测和纠正错误。
  2. 边界条件的处理

    • 确保数组中每个元素都参与运算。
    • 确保在数组长度较小时,结果依然正确。

学习心得

本题结合了异或运算和数组遍历,考察了对位运算的理解,在解决过程中,以下几点尤为重要:

  1. 明确目标与子任务

    • 问题拆解为从 a 或 b 删除元素、计算 XOR 并取最大值。
  2. 测试用例的全面性

    • 针对不同规模和边界条件的输入进行测试,确保代码健壮性。