我得到一个数组和一个值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
然而,我似乎失败了一些我看不到的额外的。
答案 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。