如何使用hashmap计算数组中奇数元素的和



给定下面的数组arr[] = {5,3,3,3,3,5,5,2},我必须生成只有奇数频率的元素的和。我的输出应该是7,即5 + 2的和。

不知什么原因,我得了10分,我不明白为什么。

public class OddnumberOfElements {
public static void main(String[] args) {
int arr[] = {5, 3, 3, 3, 3, 5, 5, 2};
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
for (int i = 0; i < arr.length; i++) {
if (map.containsKey(arr[i])) {
map.put(arr[i], map.get(arr[i]) + 1);
}
map.put(arr[i], 1);
}
int sum = 0;
for (Map.Entry<Integer, Integer> e : map.entrySet()) {
if (e.getValue() % 2 != 0) {
sum = sum + e.getKey();
}
}
System.out.println(sum);
}
}

您的第一个for循环检查int值是否已经包含在您的map中以增加其频率。如果int已经存在,则其相应的频率增加,但相反的条件是没有放在else分支中,将int频率重置为1。

循环应该这样写:

for (int i = 0; i < arr.length; i++) {
if (map.containsKey(arr[i])) {
map.put(arr[i], map.get(arr[i]) + 1);
} else {
map.put(arr[i], 1);
}
}

此外,如果你被允许使用流(我不知道这是不是学校的作业),你可以在一个更紧凑的写作中实现你正在做的事情。

int arr[] = {5, 3, 3, 3, 3, 5, 5, 2};
Integer sum = Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(Integer::intValue, Collectors.counting())) //Creating a hashmap where to each int (boxed to Integer) corresponds its frequency
.entrySet().stream() //Streaming the map's entries
.filter(e -> e.getValue() % 2 == 1) //for each entry we keep only the ones with an odd frequency
.collect(Collectors.summingInt(e -> e.getKey())); //Summing the values of Integers with an odd frequency

缺少其他

if(map.containsKey(arr[i])){
map.put(arr[i],map.get(arr[i])+1);
}
else
map.put(arr[i], 1);

这就是为什么你的元素每次都以频率1初始化,而不是递增。所以输出是5+3+2=10

您正在覆盖增量而不是:

if(map.containsKey(arr[i])){
map.put(arr[i],map.get(arr[i])+1);
}
map.put(arr[i], 1);

if(map.containsKey(arr[i])){
map.put(arr[i],map.get(arr[i])+1);
}
else map.put(arr[i], 1);

最新更新