我有一个非空数组,给出了由N个整数组成的数组。该数组包含奇数个元素,数组的每个元素都可以与另一个具有相同值的元素配对,除了一个元素未配对。
例如,在数组A中,如下所示:
A[0] = 9 , A[1] = 3 , A[2] = 9 , A[3] = 3 , A[4] = 9 , A[5] = 7 , A[6] = 9
我需要编写一个函数来返回未配对元素的值。
我的第一个本机解决方案之一是创建一个具有唯一键的hashmap结构——给定数组的N个整数,如果键已经存在于hashmap中,则遍历数组添加值。毕竟,在值字段中只有1的键是未配对的元素。
我知道Integer的hashcode是它的int唯一值…所以我soposed,不会出现不同Integer的重复键…所以我假设,不会出现不同Integer的重复键…但对于一个大的数据集,这个解决方案不起作用…我认为这与负载因子有关。但我上不去。我不需要替代解决方案,因为我已经有了它,我只是想了解当我们使用一大套整数键时hashmap有什么问题…这是我的代码,非常感谢!:Map a=new HashMap();
for(int i=0;i<A.length;i++) {
if(a.containsKey(A[i])){
a.put(A[i], a.get(A[i])+1);
}else a.put(A[i], 1);
}
for (Integer i : a.keySet()) {
if(a.get(i)==1)
return i;
}
return -1;
在此处输入图像描述
我认为这与负载系数有关。
不,问题不在于HashMap
,而在于您使用它的方式。
您的解决方案不完整,因为它假设所有对都是唯一的。即它假设最多可以有一对9(在您发布的示例中不正确,其中包含2对9)。
有多个相同的配对不一定会导致错误的答案,但是如果,例如,有3个9,其中两个是配对的,但第3个不是呢?您的解决方案找不到它,因为a. get(9)
会返回3
,但是您检查它是否等于1
。
而不是检查
if(a.get(i)==1)
你应该检查一下是否奇怪
if(a.get(i)%2==1)