Вопрос гласит:
функция thirdLargest ... принимает два аргумента. Первым аргументом является массив a [], а вторым аргументом является размер массива (n).
Хотя вопрос гласит, что массив ...
массив различных элементов
тесты показывают, что мы имеем дело с массивом целых чисел.
Лично я не вижу необходимости во втором параметре метода потому что в java массив является объектом и имеет length
член. Так что моя реализация ниже принимает только один параметр, а именно массив int
. Возможно, люди на geeksforgeeks.org просто преобразовали вопрос, который изначально был для языка C, в java, поскольку в C трудно определить размер любого массива.
Каждый элемент в TreeSet
должен быть объектом, поэтому нам нужно преобразовать элементы в массиве int
в Integer
объекты. Autoboxing сделает это автоматически, тем не менее мой код ниже содержит явное преобразование. Таким образом, в методе я создаю TreeSet
. Поскольку класс Integer
реализует интерфейс Comparable , достаточно стандартного конструктора TreeSet
. Я добавляю все элементы массива int
в TreeSet
, затем получаю нисходящий итератор и затем перехожу к третьему элементу, возвращенному итератором, который является значением, которое должен возвращать метод.
int thirdLargest(int[] arr) {
int third = -1;
if (arr != null && arr.length > 2) {
TreeSet<Integer> set = new TreeSet<Integer>();
for (int elem : arr) {
set.add(Integer.valueOf(elem));
}
Iterator<Integer> iter = set.descendingIterator();
if (iter.hasNext()) {
iter.next();
if (iter.hasNext()) {
iter.next();
if (iter.hasNext()) {
third = iter.next().intValue();
}
}
}
}
return third;
}
Конечно, если вы хотите игнорировать условия, налагаемые исходным вопросом, вы можете получить третий по величине элемент, используя stream API
IntStream.of(2, 4, 1, 3, 5)
.boxed()
.sorted(Collections.reverseOrder())
.collect(Collectors.toList()).get(2)