#java
#java
Вопрос:
Меня попросили написать программу в тестовом экзамене codility, чтобы написать функцию, которая проверяет максимальную частоту целых чисел в массиве A, возвращая значение: например:
A[0]: 10
A[1]: 7
A[2]: 10
A[3]: 10
Будет выводиться как 10
class Solution {
public int solution(int[] A) {
// write your code in Java SE 8
int count = 1, tempCount;
int mostOften = A[0];
int temp = 0;
for (int iCounter = 0; iCounter < (A.length - 1); iCounter )
{
temp = A[iCounter];
tempCount = 0;
for (int jCounter = 1; jCounter < A.length; jCounter )
{
if (temp == A[jCounter])
tempCount ;
}
if (tempCount > count)
{
mostOften = temp;
count = tempCount;
}
}
return mostOften;
}
}
Комментарии:
1. Вам потребуется только один проход через массив. У вас есть вложенный цикл, поэтому вам нужно избавиться от этого.
2. Кроме того, «используя java SE 8», я предполагаю, что они говорят вам использовать потоки. Используется
Arrays.stream()
для создания потока из массива.
Ответ №1:
Самым простым подходом было бы передать массив в потоковом режиме и преобразовать его в частотную карту, выполнить обратную сортировку по количеству и взять первый элемент:
public int solution(int[] a) {
return Arrays.stream(a)
.boxed()
.collect(Collectors.groupingBy
(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.<Integer, Long> comparingByValue().reversed())
.findFirst()
.map(Map.Entry::getKey)
.get();
}