JavaRush /Java блог /Random /Кофе-брейк #110. Решаем задачу, как найти третье по велич...

Кофе-брейк #110. Решаем задачу, как найти третье по величине число в массиве. Реверс строки в Java

Статья из группы Random

Как найти третье по величине число в массиве

Источник: Dev.to Перед нами задача, которую необходимо решить: Вам дан несортированный массив целых чисел. Как найти в массиве третье по величине число? Примечание: массив содержит как повторяющиеся значения, так и отрицательные значения, а также этот код должен работать, если длина массива увеличивается в N раз. Кофе-брейк #110. Решаем задачу, как найти третье по величине число в массиве. Реверс строки в Java - 1Решение дается в Java:

Пример 1: Несортированный массив с отрицательными значениями

Ввод: [87, 99, -14, 05, 46, 54] Код:

public class ThirdLargestNumInArray {

    public static void main(String[] args) {

        /*
         * unsorted Array with duplicate and negative values
         */
        Integer arr[] = { 87, 99, -14, 05, 46, 54 };

        /* Variable initialization */
        int largest = 0, secondLargest = 0, thirdLargest = 0;

        /* Condition to find */
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > largest) {
                /*
                 * if condition is true assign large value to second large value
                 */
                secondLargest = largest;

                /* assign new large value */
                largest = arr[i];

            } else if (arr[i] > secondLargest) {
                /*
                 * if condition is true assign second large value to third large value
                 */
                thirdLargest = secondLargest;

                /* assign new second large value */
                secondLargest = arr[i];

            } else if (arr[i] > thirdLargest) {
                /*
                 * if condition is true the third largest value will be assigned
                 */
                thirdLargest = arr[i];
            }
        }

        /* Print the values */
        System.out.println("Largest = " + largest);
        System.out.println("Second Largest = " + secondLargest);
        System.out.println("Third Largest = " + thirdLargest);

    }
}
Вывод:
Largest = 99 Second Largest = 87 Third Largest = 54
Объяснение:
  1. Как упоминалось выше, массив инициализируется как положительными, так и отрицательными значениями.

  2. Мы инициализируем переменные для хранения самого большого, второго по величине и третьего по величине значения соответственно. Примечание: переменные инициализируются как 0 для одного особого случая: если третий максимальный элемент отсутствует в массиве, он вернет 0.

  3. Повторяем цикл N (длина массива) число раз, чтобы найти три самых больших значения.

  4. Если условие состоит в том, чтобы присвоить самое большое значение второму большому значению и инициализировать новое большое значение в массиве.

    1-е условие elseif состоит в том, чтобы присвоить второе большое значение третьему большому значению и инициализировать новое второе большое значение в массиве.

    2-е условие elseif — присвоить третье большое значение в массиве.

  5. Наконец, печатаем переменные.

Пример 2: Несортированный массив с отрицательными и повторяющимися значениями

Ввод: [77, 101, 95, 14, 05, 46, -47, 94, 00, 95, 52, 86, 36, -54, 94, 89] Код:

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class ThirdLargestNumInSet {

    public static void main(String[] args) {

        /*
         * unsorted Array with duplicate and negative values
         */
        Integer arr[] = { 77, 101, 14, 05, 46, -47, 94, 00, 95, 52, 86, 36, -54, 94, 89 };

        /* Variable initialization */
        int largest = 0, secondLargest = 0, thirdLargest = 0;

        /*
         * using LinkedHashSet - Map to remove duplication in Array
         */
        Set<Integer> newSet = new LinkedHashSet<>();

        for (int i = 0; i < arr.length; i++) {
            newSet.add(arr[i]);
        }

        /* Condition to find */
        for (Integer i : newSet) {
            if (i > largest) {
                /*
                 * if condition is true assign large value to second large value
                 */
                secondLargest = largest;

                /* assign new large value */
                largest = i;

            } else if (i > secondLargest) {
                /*
                 * if condition is true assign second large value to third large value
                 */
                thirdLargest = secondLargest;

                /* assign new second large value */
                secondLargest = i;

            } else if (i > thirdLargest) {
                /*
                 * if condition is true the third largest value will be assigned
                 */
                thirdLargest = i;
            }
        }

        /* Print the values */
        System.out.print("Largest = " + largest);
        System.out.print("\nSecond Largest = " + secondLargest);
        System.out.print("\nThird Largest = " + thirdLargest);
    }
}
Вывод:
Largest = 101 Second Largest = 95 Third Largest = 94
Объяснение: Псевдокод, используемый в обоих кодах, одинаков, единственная разница в примере 2 заключается в том, что мы используем LinkedHashSet. Он представляет собой коллекцию Java, в которой мы храним уникальные объекты, что приводит к удалению повторяющихся значений в массиве.

Еще один вариант решения:

Мы можем использовать алгоритм пузырьковой сортировки (сортировка от наименьшего к наибольшему порядку), чтобы отсортировать массив и найти наибольшее значение массива. Ввод: [87, 99, 14, 05, 46, 54] Код:

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class Main {

    public static void bubblesort(Integer[] arr) {

        int n = arr.length;
        int temp;

        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }

            }
        }

    }

    public static void main(String[] args) {

        Integer[] arr = { 87, 99, 14, 05, 46, 54 };

        bubblesort(arr);

        System.out.print("array after sorting : ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        int n = arr.length;

        int max = arr[n - 3];
        System.out.println("\n3rd largest value: " + max);
    }

}
Вывод:
array after sorting : 5 14 46 54 87 99 3rd largest value: 54

Реверс строки в Java

Источник: Dev.to

Java-программа для реверсирования строки с использованием StringBuilder

Объяснение: Строки (Strings) — это объекты в Java, которые внутренне поддерживаются массивом символов. Строки неизменяемы, потому что массивы неизменны (закрыты для модификации). Каждый раз, когда вы вносите изменения в строку, создается новая строка. В нашем случае мы используем StringBuilder, который является изменяемым. Примечание: мы также можем использовать класс StringBuffer. Код:

public class ReverseStringBuilder {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Create StringBuilder(mutable) object */
        StringBuilder s1 = new StringBuilder();

        /* Using append() and reverse() in StringBuilder */
        s1.append(name);
        s1 = s1.reverse();

        /* Print the reverse */
        System.out.println(s1);

    }

}
Вывод:
emordnilaP
Последовательность действий:
  1. Создайте объект класса String и инициализируйте его.

  2. Создайте объект класса string builder.

  3. Используйте встроенные функции string builder append() и reverse().

  4. Напечатайте объект string builder.

Java-программа для реверсирования строки без использования встроенной функции String reverse()

Метод 1

Объяснение: Функция toCharArray() используется для преобразования этой строки в массив символов. После этого мы будем использовать цикл for для прохождения каждого символа в обратном порядке и получения вывода для каждого символа. Код:

public class Reverse {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Using toCharArray() function */
        char[] ch = name.toCharArray();

        /* Temp string */
        String rev = "";

        /* Iterating for loop in reverse to store */
        for (int i = ch.length - 1; i >= 0; i--) {
            /* Concatenating Strings */
            rev += ch[i];
        }

        /* Print the reverse */
        System.out.println(rev);

    }

}
Вывод:
emordnilaP
Последовательность действий:
  1. Создайте объект класса String и инициализируйте его.

  2. Создайте массив символов и вызовите функцию toCharArray() с объектом String.

  3. Создание объекта класса String для временной переменной.

  4. Повторите цикл for в обратном порядке, чтобы получить каждый символ в обратном порядке.

  5. Объедините каждый символ в переменной Temp.

  6. Напечатайте Temp.

Метод 2

Объяснение: Используя цикл for, мы напечатали строку в обратном порядке. С другой стороны, метод charAt(index) возвращает символ с любым заданным индексом. Символ будет объединяться после каждой итерации, чтобы изменить строковую переменную. Код:

public class ReverseCharAt {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Temp string */
        String rev = "";

        /* Iterating for loop in reverse to store */
        for (int i = name.length() - 1; i >= 0; i--) {
            /* Concatenating Strings */
            rev = rev + name.charAt(i);
        }

        /* Print the reverse */
        System.out.println(rev);

    }

}
Вывод:
emordnilaP
Последовательность действий:
  1. Создание объекта класса String и его инициализация.

  2. Создание объекта класса String для временной переменной.

  3. Повторение цикла for в обратном порядке, чтобы получить каждый символ в обратном порядке.

  4. Объединение каждого символа в переменную Temp с помощью вызова функции charAt().

  5. Печатаем Temp.

Специальное примечание: наверное, функция реверса вам знакома, но здесь цель состоит в том, чтобы изучить возможности StringBuilder и то, как можно оптимизировать код без функции реверса. Надеюсь, это поможет кому-то в будущем!
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
AZorenko Уровень 23
25 июля 2022
А если массив состоит только из отрицательньіх чисел?
Эд Кукса Уровень 29
20 марта 2022
В третьем примере

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
явно лишние.
Anonymous #2592369 Уровень 22
18 марта 2022
Полезная статья, большое спасибо!