给定一个由N个整数组成的数组arr [] ,任务是找到一个整数K ,其位数不超过任何数组元素中存在的最大位数,将其添加到数组后,可使数组的按位XOR最大化。
例子:
Input: N = 7, arr[] = {1, 7, 8, 11, 6, 9, 6}
Output: 3
Explanation:
Bitwise XOR of the given array = 1 ^ 7 ^ 8 ^ 11 ^ 6 ^ 9 ^ 6 = 12
(12)2 = (1100)2
(0011)2 = (3)10 is the best option of maximizing XOR of the array.
Therefore, 12 ^ 3 = 15 is the maximum possible XOR of the given array.
Input: N = 5, arr[] = {1, 2, 3, 4, 5}
Output: 6
Explanation:
Bitwise XOR of the given array = 1 ^ 2 ^ 3 ^ 4 ^ 5 = 1
(1)2 = (0001)2
(0110)2 = (6)10 is the best option of maximizing XOR of the array.
Therefore, 1 ^ 6 = 7 is the maximum possible XOR of the given array.
方法:请按照以下步骤解决问题:
- 计算数组所有元素的按位XOR
- 计算数组元素的已计算XOR的补数,以使补数中的位数等于任何数组元素中存在的最大位数。
- XOR的补码是要添加的值,以使给定数组的按位XOR最大化。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find complement of an integer
unsigned int onesComplement(unsigned int n,
int maxElement)
{
// Count the number of bits of maxElement
int bits = floor(log2(maxElement)) + 1;
// Return 1's complement
return ((1 << bits) - 1) ^ n;
}
// Function to find the value required to be
// added to maximize XOR of the given array
int findNumber(int arr[], int n)
{
// Stores the required value
// to be added to the array
unsigned int res = 0;
// Stores the maximum array element
int maxElement = 0;
// Traverse the array
for (int i = 0; i < n; i++) {
// Update XOR of the array
res = res ^ arr[i];
// Find maximum element in array
if (maxElement < arr[i])
maxElement = arr[i];
}
// Calculate 1s' complement
res = onesComplement(res,
maxElement);
// Return the answer
return (res);
}
// Driver Code
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
cout << findNumber(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
import java.io.*;
import java.lang.*;
class GFG{
// Function to find complement of an integer
static int onesComplement(int n,
int maxElement)
{
// Count the number of bits of maxElement
int bits = (int)Math.floor((
Math.log(maxElement) /
Math.log(2))) + 1 ;
// Return 1's complement
return ((1 << bits) - 1) ^ n;
}
// Function to find the value required to be
// added to maximize XOR of the given array
static int findNumber(int arr[], int n)
{
// Stores the required value
// to be added to the array
int res = 0;
// Stores the maximum array element
int maxElement = 0;
// Traverse the array
for(int i = 0; i < n; i++)
{
// Update XOR of the array
res = res ^ arr[i];
// Find maximum element in array
if (maxElement < arr[i])
maxElement = arr[i];
}
// Calculate 1s' complement
res = onesComplement(res,
maxElement);
// Return the answer
return (res);
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 1, 2, 3, 4, 5 };
int N = arr.length;
System.out.print(findNumber(arr, N));
}
}
// This code is contributed by sanjoy_62
Python3
# Python program for the above approach
import math
# Function to find complement of an integer
def onesComplement(n, maxElement) :
# Count the number of bits of maxElement
bits = math.floor(math.log2(maxElement)) + 1
# Return 1's complement
return ((1 << bits) - 1) ^ n
# Function to find the value required to be
# added to maximize XOR of the given array
def findNumber(arr, n) :
# Stores the required value
# to be added to the array
res = 0
# Stores the maximum array element
maxElement = 0
# Traverse the array
for i in range(n):
# Update XOR of the array
res = res ^ arr[i]
# Find maximum element in array
if (maxElement < arr[i]):
maxElement = arr[i]
# Calculate 1s' complement
res = onesComplement(res, maxElement)
# Return the answer
return (res)
# Driver Code
arr = [ 1, 2, 3, 4, 5 ]
N = len(arr)
print(findNumber(arr, N))
# This code is contributed by code_hunt.
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to find complement of an integer
static int onesComplement(int n,
int maxElement)
{
// Count the number of bits of maxElement
int bits = (int)Math.Floor((
Math.Log(maxElement) /
Math.Log(2))) + 1 ;
// Return 1's complement
return ((1 << bits) - 1) ^ n;
}
// Function to find the value required to be
// added to maximize XOR of the given array
static int findNumber(int[] arr, int n)
{
// Stores the required value
// to be added to the array
int res = 0;
// Stores the maximum array element
int maxElement = 0;
// Traverse the array
for(int i = 0; i < n; i++)
{
// Update XOR of the array
res = res ^ arr[i];
// Find maximum element in array
if (maxElement < arr[i])
maxElement = arr[i];
}
// Calculate 1s' complement
res = onesComplement(res,
maxElement);
// Return the answer
return (res);
}
// Driver Code
public static void Main()
{
int[] arr = { 1, 2, 3, 4, 5 };
int N = arr.Length;
Console.Write(findNumber(arr, N));
}
}
// This code is contributed by susmitakundugoaldanga
Javascript
6
时间复杂度: O(N)
辅助空间: O(1)