Если я правильно понял задачу, то вам нужно посчитать количество всех элементов, встречающихся более одного раза.
| Код | public class FindDuplicates { public static void main(String[] args) { Integer[] arr = {1, 2, 3, 5, 3, 8, 8, 1, 7, 4, 3, 8, 1, 4, 0, 3, 6, 9}; Map<Integer, Integer> indexed = indexCount(arr); int duplicates = countDuplicates(indexed); System.out.printf("Количество дубликатов - %d", duplicates); } /** * Маппит элемент на количество его повторений во входном массиве. */ public static <E> Map<E, Integer> indexCount(E... arr) { Map<E, Integer> index = new HashMap<E, Integer>(); for (E elem : arr) { Integer counter = index.get(elem); if (counter != null) { index.put(elem, counter + 1); } else { index.put(elem, 1); } } return index; } /** * Ищет повторения в подготовленном словаре. Повторением считается элемент, * который встречается более одного раза. */ public static <E> int countDuplicates(Map<E, Integer> indexed) { int count = 0; for (Entry<E, Integer> index : indexed.entrySet()) { Integer value = index.getValue(); if (value > 1) { count = count + value; } } return count; }
}
|
Вычисление производится в два этапа - сначала узнаем, сколько повторений в массиве для каждого элемента, затем считаем количество элементов, которые встречаются более одного раза. Решение за O(n).
Тесты:
| Код | public class FindDuplicatesTest { @Test public void testOneOfEach() { Map<Integer, Integer> index = FindDuplicates.indexCount(1, 2, 3); assertEquals(1, index.get(2).intValue()); }
@Test public void testGetsIndexed() { Map<Integer, Integer> index = FindDuplicates.indexCount(1, 3, 2, 2, 3, 5, 3, 3); assertEquals(1, index.get(1).intValue()); assertEquals(4, index.get(3).intValue()); } @Test public void testCountDuplicates() { Map<Integer, Integer> indexed = FindDuplicates.indexCount(1, 3, 2, 2, 3, 5, 3, 3); int duplicates = FindDuplicates.countDuplicates(indexed); assertEquals(6, duplicates); } }
|
|