编程以找到XOR到给定值的数组中的对

时间:2016-12-06 15:21:15

标签: java arrays algorithm xor

我得到一个数组和一个值x。

输入示例:

2 3
1 2

其中n(数组长度)= 2,值x = 3,下一行(1,2)包含数组中的值。我必须找到索引i,j的对,以便a [i] XOR a [j] = x。

我实施的内容:

import java.util.HashSet;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
   Scanner sc = new Scanner(System.in);

   int n = sc.nextInt();
   int x = sc.nextInt();

   int[] arr = new int[n];

   HashSet<Integer> hash = new HashSet<Integer>();

   for (int i = 0; i < n; i++) {
     arr[i] = sc.nextInt();
     hash.add(arr[i]);
   }

   int count = 0;

   for (int i = 0; i < n; i++) {
     if (hash.contains(arr[i]^x)) {
       count++;
     }
   }

   System.out.println(count/2);
  }

}

我将结果除以2,因为我们只想计算一次给定的对(只计数[1,2]而不是[1,2]和[2,1])。

我通过输出为1的上面给定的测试,以及输出为2的补充测试。

6 1
5 1 2 3 4 1

然而,我似乎失败了一些我看不到的额外的。

3 个答案:

答案 0 :(得分:2)

问题是你检查“包含”,但对于重复值,这只返回一次。通过使用一组你扔掉重复。相反,你应该有一个出现次数的HashMap:

Map<Integer, Integer> hash = new HashMap<>();

for (int i = 0; i < n; i++) {
    arr[i] = sc.nextInt();
    if (!hash.containsKey(arr[i])) {
        hash.put(arr[i], 0)
    }
    hash.put(arr[i], hash.get(arr[i]) + 1);
}

int count = 0;

for (int i = 0; i < n; i++) {
    if (hash.containsKey(arr[i]^x)) {
        count += hash.get(arr[i]^x);
    }
}

答案 1 :(得分:1)

count除以2作为最终答案的逻辑是不正确的。 用以下内容替换您的逻辑:

HashSet<Integer> hash = new HashSet<Integer>();

   for (int i = 0; i < n; i++) {
     arr[i] = sc.nextInt();
   }

   int count = 0;

   for (int i = 0; i < n; i++) {
     if (hash.contains(arr[i]^x)) {
       count++;
     }
     hash.add(arr[i]);
   }

   System.out.println(count);

答案 2 :(得分:0)

您的程序无法正确处理重复的数字。它可以处理5 1 2 3 4 1,因为1不是解决方案的一部分。如果它是什么?

我们说数字a[i] ^ a[j]a[i] ^ a[k]的解决方案。换句话说,a[j] == a[k]hash.contains(arr[i]^x)行只会计算一次a[i]

您可以通过嵌套for循环来解决此问题。

for (int i = ...) {
  for (int j = ...) {
    if (a[i] ^ a[j] == x) {
      count++;
    }
  }
}

这种方法可以让你摆脱hash集。如果你足够聪明地填写...部分,你可以避免重复计算对,并且不必将count除以2。