Gievn 跟隨陣列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);
}
}
uj5u.com熱心網友回復:
你的第一個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
uj5u.com熱心網友回復:
缺少其他
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
uj5u.com熱心網友回復:
您正在覆寫增量而不是:
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/469272.html
