给定一个数字在哪里, 。任务是找到之间要删除的最小元素数至使得从其余元素获得的XOR最大。
例子:
Input: N = 5
Output: 2
Input: 1000000000000000
Output: 1
方法:考虑以下情况:
Case 1: When or , then answer is 0. No need to remove any element.
Case 2: Now, we have to find a number which is power of 2 and greater than or equal to .
Let’s call this number be .
So, if or then we will just remove . Hence the answer is 1.
else if , then answer is 0. No need to remove any element.
Case 3: Otherwise, if is , then answer is 1.
else if is , then answer is 2.
下面是上述方法的实现:
C++
// C++ implementation to find minimum number of
// elements to remove to get maximum XOR value
#include
using namespace std;
unsigned int nextPowerOf2(unsigned int n)
{
unsigned count = 0;
// First n in the below condition
// is for the case where n is 0
if (n && !(n & (n - 1)))
return n;
while (n != 0) {
n >>= 1;
count += 1;
}
return 1 << count;
}
// Function to find minimum number of
// elements to be removed.
int removeElement(unsigned int n)
{
if (n == 1 || n == 2)
return 0;
unsigned int a = nextPowerOf2(n);
if (n == a || n == a - 1)
return 1;
else if (n == a - 2)
return 0;
else if (n % 2 == 0)
return 1;
else
return 2;
}
// Driver code
int main()
{
unsigned int n = 5;
// print minimum number of elements
// to be removed
cout << removeElement(n);
return 0;
}
Java
//Java implementation to find minimum number of
//elements to remove to get maximum XOR value
public class GFG {
static int nextPowerOf2(int n)
{
int count = 0;
// First n in the below condition
// is for the case where n is 0
if (n!=0 && (n& (n - 1))==0)
return n;
while (n != 0) {
n >>= 1;
count += 1;
}
return 1 << count;
}
//Function to find minimum number of
//elements to be removed.
static int removeElement(int n)
{
if (n == 1 || n == 2)
return 0;
int a = nextPowerOf2(n);
if (n == a || n == a - 1)
return 1;
else if (n == a - 2)
return 0;
else if (n % 2 == 0)
return 1;
else
return 2;
}
//Driver code
public static void main(String[] args) {
int n = 5;
// print minimum number of elements
// to be removed
System.out.println(removeElement(n));
}
}
Python 3
# Python 3 to find minimum number
# of elements to remove to get
# maximum XOR value
def nextPowerOf2(n) :
count = 0
# First n in the below condition
# is for the case where n is 0
if (n and not(n and (n - 1))) :
return n
while n != 0 :
n >>= 1
count += 1
return 1 << count
# Function to find minimum number
# of elements to be removed.
def removeElement(n) :
if n == 1 or n == 2 :
return 0
a = nextPowerOf2(n)
if n == a or n == a - 1 :
return 1
elif n == a - 2 :
return 0
elif n % 2 == 0 :
return 1
else :
return 2
# Driver Code
if __name__ == "__main__" :
n = 5
# print minimum number of
# elements to be removed
print(removeElement(n))
# This code is contributed
# by ANKITRAI1
C#
//C# implementation to find minimum number of
//elements to remove to get maximum XOR value
using System;
public class GFG {
static int nextPowerOf2(int n)
{
int count = 0;
// First n in the below condition
// is for the case where n is 0
if (n!=0 && (n& (n - 1))==0)
return n;
while (n != 0) {
n >>= 1;
count += 1;
}
return 1 << count;
}
//Function to find minimum number of
//elements to be removed.
static int removeElement(int n)
{
if (n == 1 || n == 2)
return 0;
int a = nextPowerOf2(n);
if (n == a || n == a - 1)
return 1;
else if (n == a - 2)
return 0;
else if (n % 2 == 0)
return 1;
else
return 2;
}
//Driver code
public static void Main() {
int n = 5;
// print minimum number of elements
// to be removed
Console.Write(removeElement(n));
}
}
PHP
>= 1;
$count += 1;
}
return 1 << $count;
}
// Function to find minimum number
// of elements to be removed.
function removeElement($n)
{
if ($n == 1 || $n == 2)
return 0;
$a = nextPowerOf2($n);
if ($n == $a || $n == $a - 1)
return 1;
else if ($n == $a - 2)
return 0;
else if ($n % 2 == 0)
return 1;
else
return 2;
}
// Driver code
$n = 5;
// print minimum number of
// elements to be removed
echo removeElement($n);
// This code is contributed by mits
?>
输出:
2
时间复杂度: O(logn)