Вот (неполированное) решение:
static String highestRepeated(String[] str) {
String[] sorted = Arrays.copyOf(str, str.length);
Arrays.sort(sorted, 0, sorted.length, Comparator.reverseOrder());
String currentString = sorted[0];
String bestString = sorted[0];
int maxCount = 1;
int currentCount = 1;
for (int i = 1 ; i < sorted.length ; i++) {
if (currentString.equals(sorted[i])) {
currentCount++;
} else {
if (maxCount < currentCount) {
maxCount = currentCount;
bestString = currentString;
}
currentString = sorted[i];
currentCount = 1;
}
}
if (currentCount > maxCount) {
return currentString;
}
return bestString;
}
Пояснение:
Сортировка массива по лексикографически по убыванию. Вот что делает Arrays.sort(sorted, 0, sorted.length, Comparator.reverseOrder());
. мы сортируем в этом порядке, потому что вы хотите самую большую строку, если есть несколько строк с одинаковым количеством повторений.
Теперь мы можем просто считать строки, проходя через массив. Нам не нужна хеш-карта или что-то еще, потому что мы знаем, что в остальной части массива не будет больше строки, когда мы встретим другую строку.
currentString
- это строка, для которой в данный момент мы рассчитываем количество повторений, используя currentCount
. maxCount
- это число вхождений самой повторяющейся строки - bestString
- которую мы в настоящее время посчитали.
Оператор if довольно понятен: если это та же строка, посчитайте ее, в противном случае посмотрите, не окажется ли предыдущая строка, которую мы посчитали (currentCount
), больше, чем текущий максимум.
В конце я проверяю, превышает ли последняя подсчитанная строка максимум. Если последняя строка в массиве окажется самой повторяющейся, bestString
не будет назначена ему, потому что bestString
назначается только тогда, когда встречается другая строка.
Обратите внимание, что этот алгоритм не обрабатывает граничные случаи, такие как пустые массивы или только одноэлементные массивы. Я уверен, что вы сами это поймете.