题目描述
给定两个长度为 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
思路
- 计算总和:首先,需要计算出两个数组
a和b的总和,分别记为sumA和sumB。 - 尝试删除元素:
- 可以遍历数组
a,对于每一个元素a[i],计算删除该元素后的新总和newSumA = sumA - a[i],并与sumB进行异或运算,得到newSumA ^ sumB。 - 同样地,也需要遍历数组
b,对于每一个元素b[j],计算删除该元素后的新总和newSumB = sumB - b[j],并与sumA进行异或运算,得到sumA ^ newSumB。
- 记录最大值:在上述两个步骤中,需要记录所有计算出的异或值的最大值。
Java代码
public class Main {
public static int solution(int n, int[] a, int[] b) {
// write code here
// 计算数组 a 和 b 的总和
int sumA = 0;
int sumB = 0;
for (int num : a) {
sumA += num;
}
for (int num : b) {
sumB += num;
}
int maxXor = 0;
// 尝试删除数组 a 中的每一个元素
for (int i = 0; i < n; i++) {
int newSumA = sumA - a[i];
int newSumB = sumB;
maxXor = Math.max(maxXor, newSumA ^ newSumB);
}
// 尝试删除数组 b 中的每一个元素
for (int i = 0; i < n; i++) {
int newSumA = sumA;
int newSumB = sumB - b[i];
maxXor = Math.max(maxXor, newSumA ^ newSumB);
}
return maxXor;
}
public static void main(String[] args) {
System.out.println(solution(3, new int[]{1, 2, 3}, new int[]{3, 2, 1}) == 5);
System.out.println(solution(4, new int[]{4, 5, 6, 7}, new int[]{7, 8, 9, 10}) == 51);
System.out.println(solution(5, new int[]{10, 20, 30, 40, 50}, new int[]{50, 40, 30, 20, 10}) == 248);
}
}
复杂度分析
时间复杂度:O(n),需要遍历数组 a 和 b 各一次来计算总和,并且又需要遍历两次(每个数组一次)来计算异或值,因此总的时间复杂度为 O(n)。
空间复杂度:O(1),只使用了常量级别的额外空间来存储总和和最大异或值,不依赖于输入规模。