给定一个由不同的正整数组成的数组和一个数字x,请找到XOR等于x的数组中整数对的数量。
例子:
Input : arr[] = {5, 4, 10, 15, 7, 6}, x = 5
Output : 1
Explanation : (10 ^ 15) = 5
Input : arr[] = {3, 6, 8, 10, 15, 50}, x = 5
Output : 2
Explanation : (3 ^ 6) = 5 and (10 ^ 15) = 5
一种简单的解决方案是遍历每个元素,并检查是否存在另一个与XOR等于x的数字。该解决方案花费O(n 2 )时间。
有效解决此问题需要O(n)时间。该想法基于以下事实:当且仅当arr [i] ^ x等于arr [j]时,arr [i] ^ arr [j]等于x。
1) Initialize result as 0.
2) Create an empty hash set "s".
3) Do following for each element arr[i] in arr[]
(a) If x ^ arr[i] is in "s", then increment result by 1.
(b) Insert arr[i] into the hash set "s".
3) return result.
C++
// C++ program to Count all pair with given XOR
// value x
#include
using namespace std;
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty set that stores the visiting
// element of array.
// Refer below post for details of unordered_set
// https://www.geeksforgeeks.org/unorderd_set-stl-uses/
unordered_set s;
for (int i=0; iJava
// Java program to Count all pair with
// given XOR value x
import java.util.*;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty set that stores the visiting
// element of array.
// Refer below post for details of unordered_set
// https://www.geeksforgeeks.org/unorderd_set-stl-uses/
HashSet s = new HashSet();
for (int i = 0; i < n; i++)
{
// If there exist an element in set s
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (s.contains(x ^ arr[i]) &&
(x ^ arr[i]) == (int) s.toArray()[s.size() - 1])
{
result++;
}
// Make element visited
s.add(arr[i]);
}
// return total count of
// pairs with XOR equal to x
return result;
}
// Driver code
public static void main(String[] args)
{
int arr[] = {5, 4, 10, 15, 7, 6};
int n = arr.length;
int x = 5;
System.out.print("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
// This code contributed by Rajput-Ji
Python3
# Python3 program to count all the pair
# with given xor
# Returns count of pairs in arr[0..n-1]
# with XOR value equals to x.
def xorPairCount(arr, n, x):
result = 0 # Initialize result
# create empty set that stores the
# visiting element of array.
s = set()
for i in range(0, n):
# If there exist an element in set s
# with XOR equals to x^arr[i], that
# means there exist an element such
# that the XOR of element with arr[i]
# is equal to x, then increment count.
if(x ^ arr[i] in s):
result = result + 1
# Make element visited
s.add(arr[i])
return result
# Driver Code
if __name__ == "__main__":
arr = [5, 4, 10, 15, 7, 6]
n = len(arr)
x = 5
print("Count of pair with given XOR = " +
str(xorPairCount(arr, n, x)))
# This code is contributed by Anubhav Natani
C#
// C# program to Count all pair with
// given XOR value x
using System;
using System.Collections.Generic;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int []arr, int n, int x)
{
int result = 0; // Initialize result
// create empty set that stores the visiting
// element of array.
// Refer below post for details of unordered_set
// https://www.geeksforgeeks.org/unorderd_set-stl-uses/
HashSet s = new HashSet();
for (int i = 0; i < n; i++)
{
// If there exist an element in set s
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (s.Contains(x ^ arr[i]))
{
result++;
}
// Make element visited
s.Add(arr[i]);
}
// return total count of
// pairs with XOR equal to x
return result;
}
// Driver code
public static void Main()
{
int []arr = {5, 4, 10, 15, 7, 6};
int n = arr.Length;
int x = 5;
Console.WriteLine("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
/* This code contributed by PrinciRaj1992 */
C++
// C++ program to Count all pair with given XOR
// value x
#include
using namespace std;
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
unordered_map m;
for (int i=0; iJava
// Java program to Count all pair with given XOR
// value x
import java.util.*;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
Map m = new HashMap<>();
for (int i = 0; i < n ; i++)
{
int curr_xor = x^arr[i];
// If there exist an element in map m
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (m.containsKey(curr_xor))
result += m.get(curr_xor);
// Increment count of current element
if(m.containsKey(arr[i]))
{
m.put(arr[i], m.get(arr[i]) + 1);
}
else{
m.put(arr[i], 1);
}
}
// return total count of pairs with XOR equal to x
return result;
}
// Driver code
public static void main(String[] args)
{
int arr[] = {2, 5, 2};
int n = arr.length;
int x = 0;
System.out.println("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 program to Count all pair with
# given XOR value x
# Returns count of pairs in arr[0..n-1]
# with XOR value equals to x.
def xorPairCount(arr, n, x):
result = 0 # Initialize result
# create empty map that stores counts
# of individual elements of array.
m = dict()
for i in range(n):
curr_xor = x ^ arr[i]
# If there exist an element in map m
# with XOR equals to x^arr[i], that
# means there exist an element such that
# the XOR of element with arr[i] is equal
# to x, then increment count.
if (curr_xor in m.keys()):
result += m[curr_xor]
# Increment count of current element
if arr[i] in m.keys():
m[arr[i]] += 1
else:
m[arr[i]] = 1
# return total count of pairs
# with XOR equal to x
return result
# Driver Code
arr = [2, 5, 2]
n = len(arr)
x = 0
print("Count of pairs with given XOR = ",
xorPairCount(arr, n, x))
# This code is contributed by Mohit Kumar
C#
// C# program to Count all pair with given XOR
// value x
using System;
using System.Collections.Generic;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int []arr, int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
Dictionary m = new Dictionary();
for (int i = 0; i < n ; i++)
{
int curr_xor = x^arr[i];
// If there exist an element in map m
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (m.ContainsKey(curr_xor))
result += m[curr_xor];
// Increment count of current element
if(m.ContainsKey(arr[i]))
{
var val = m[arr[i]];
m.Remove(arr[i]);
m.Add(arr[i], val + 1);
}
else
{
m.Add(arr[i], 1);
}
}
// return total count of pairs with XOR equal to x
return result;
}
// Driver code
public static void Main(String[] args)
{
int []arr = {2, 5, 2};
int n = arr.Length;
int x = 0;
Console.WriteLine("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
// This code has been contributed by 29AjayKumar
输出:
Count of pairs with given XOR = 1
时间复杂度: O(n)
如何处理重复项?
如果输入数组中有重复项,则上述有效解决方案将不起作用。例如,上述解决方案对于{2,2,5}和{5,2,2}产生不同的结果。为了处理重复项,我们存储所有元素的出现次数。我们使用unordered_map而不是unordered_set。
C++
// C++ program to Count all pair with given XOR
// value x
#include
using namespace std;
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
unordered_map m;
for (int i=0; iJava
// Java program to Count all pair with given XOR
// value x
import java.util.*;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int arr[], int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
Map m = new HashMap<>();
for (int i = 0; i < n ; i++)
{
int curr_xor = x^arr[i];
// If there exist an element in map m
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (m.containsKey(curr_xor))
result += m.get(curr_xor);
// Increment count of current element
if(m.containsKey(arr[i]))
{
m.put(arr[i], m.get(arr[i]) + 1);
}
else{
m.put(arr[i], 1);
}
}
// return total count of pairs with XOR equal to x
return result;
}
// Driver code
public static void main(String[] args)
{
int arr[] = {2, 5, 2};
int n = arr.length;
int x = 0;
System.out.println("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 program to Count all pair with
# given XOR value x
# Returns count of pairs in arr[0..n-1]
# with XOR value equals to x.
def xorPairCount(arr, n, x):
result = 0 # Initialize result
# create empty map that stores counts
# of individual elements of array.
m = dict()
for i in range(n):
curr_xor = x ^ arr[i]
# If there exist an element in map m
# with XOR equals to x^arr[i], that
# means there exist an element such that
# the XOR of element with arr[i] is equal
# to x, then increment count.
if (curr_xor in m.keys()):
result += m[curr_xor]
# Increment count of current element
if arr[i] in m.keys():
m[arr[i]] += 1
else:
m[arr[i]] = 1
# return total count of pairs
# with XOR equal to x
return result
# Driver Code
arr = [2, 5, 2]
n = len(arr)
x = 0
print("Count of pairs with given XOR = ",
xorPairCount(arr, n, x))
# This code is contributed by Mohit Kumar
C#
// C# program to Count all pair with given XOR
// value x
using System;
using System.Collections.Generic;
class GFG
{
// Returns count of pairs in arr[0..n-1] with XOR
// value equals to x.
static int xorPairCount(int []arr, int n, int x)
{
int result = 0; // Initialize result
// create empty map that stores counts of
// individual elements of array.
Dictionary m = new Dictionary();
for (int i = 0; i < n ; i++)
{
int curr_xor = x^arr[i];
// If there exist an element in map m
// with XOR equals to x^arr[i], that means
// there exist an element such that the
// XOR of element with arr[i] is equal to
// x, then increment count.
if (m.ContainsKey(curr_xor))
result += m[curr_xor];
// Increment count of current element
if(m.ContainsKey(arr[i]))
{
var val = m[arr[i]];
m.Remove(arr[i]);
m.Add(arr[i], val + 1);
}
else
{
m.Add(arr[i], 1);
}
}
// return total count of pairs with XOR equal to x
return result;
}
// Driver code
public static void Main(String[] args)
{
int []arr = {2, 5, 2};
int n = arr.Length;
int x = 0;
Console.WriteLine("Count of pairs with given XOR = "
+ xorPairCount(arr, n, x));
}
}
// This code has been contributed by 29AjayKumar
输出:
Count of pairs with given XOR = 1
时间复杂度: O(n)