对于给定的非负整数数组Arr [],任务是确定一个整数X,使得(Arr [0] XOR X)+(Arr [1] XOR X)+…+ Arr [n – 1] XOR X是最小可能的。
输入值
Arr[] = {3, 4, 5, 6, 7}
输出结果
X = 7, Sum = 10
因此,我们将以二进制表示形式验证数组中每个数字的'i'位,并考虑并计数那些包含将'i'位设置为'1'的数字,因为这些设置位将有助于使总和最大化而不是使其最小化。结果,如果计数大于N / 2,并且计数小于N / 2,那么必须将第i个位设置为“ 0”,那么将第i个位设置的数字就较少因此,它不会影响答案。根据两个位的XOR运算,当A XOR B以及A和B都相同时,其结果为'0',因此我们将数字(num)中的'i'位构建为'1'结果是(1 XOR 1)将给出'0'并最小化和。
// C++ implementation of the approach #include <bits/stdc++.h> #include <cmath> using namespace std; void findX1(int arr1[], int n1){ int* itr1 = max_element(arr1, arr1 + n1); int p1 = log2(*itr1) + 1; int X1 = 0; for (int i = 0; i < p1; i++) { int count1 = 0; for (int j = 0; j < n1; j++) { if (arr1[j] & (1 << i)) { count1++; } } if (count1 > (n1 / 2)) { X1 += 1 << i; } } long long int sum1 = 0; for (int i = 0; i < n1; i++) sum1 += (X1 ^ arr1[i]); cout << "X = " << X1 << ", Sum = " << sum1; } //驱动程式码 int main(){ int arr1[] = { 3, 4, 5, 6, 7 }; int n1 = sizeof(arr1) / sizeof(arr1[0]); findX1(arr1, n1); return 0; }
输出结果
X = 7, Sum = 10