👥Сегодня в 17:00 (МСК) стартует первый день и открытие Yandex Scale 2023.
💻Ссылка
Please open Telegram to view this post
VIEW IN TELEGRAM
☝️💡💻Алгоритм Дейкстры - это алгоритм нахождения кратчайшего пути от одной вершины графа до всех остальных вершин. Он работает на графах с неотрицательными весами ребер.

⚙️ Алгоритм Дейкстры работает следующим образом:

➡️Создается массив расстояний dist, в котором для каждой вершины хранится текущее кратчайшее расстояние от начальной вершины до этой вершины. Изначально все расстояния устанавливаются в бесконечность, кроме начальной вершины, для которой расстояние равно 0.

💬Создается множество visited для отслеживания уже посещенных вершин. Изначально все вершины помечаются как непосещенные.

🚪Начальная вершина добавляется в множество visited.

💬Пока множество visited не содержит все вершины графа:
Выбирается вершина u из множества visited с наименьшим значением dist[u].
Для каждой смежной с u вершины v, если dist[u] + weight(u, v) < dist[v], то обновляется значение dist[v] на dist[u] + weight(u, v).
Вершина v добавляется в множество visited.

⭐️По окончании алгоритма массив dist содержит кратчайшие расстояния от начальной вершины до всех остальных вершин графа.

Код Алгоритм Дейкстры 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Рекурсия — вызов внутри одной функции себя самой, чаще всего с другими параметрами.
В приведенном примере мы используем рекурсию для вычисления факториала числа.

⭐️Метод multiplyNumbers() вызывает сам себя с аргументом num - 1 до тех пор, пока num не станет меньше или равным 1. Затем метод возвращает результат умножения num на результат вызова multiplyNumbers() с аргументом num - 1. Когда num достигнет 1, метод multiplyNumbers() вернет 1, что остановит рекурсивные вызовы и вернет результат вычисления факториала.

Алгоритмическая сложность
вычисления факториала числа с использованием рекурсии составляет O(n), где n - число, для которого вычисляется факториал🫡.

Код вычисления факториала 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
☝️💡Рекурсия (Range minimum requests). Позволяет построить дерево отрезков и находить минимум на заданном отрезке, используя рекурсивный подход.

🙋Рекурсия позволяет эффективно решать задачи, связанные с обработкой структур данных, таких как деревья отрезков.

🤯Препроцессинг тратит времени O(n^2) и памяти O(n^2) из-за двумерного массива, в котором запоминает результат. Для массива длинной 1 млдр. алгоритм займёт 930 тыс. терабайт памяти, а квадратичное время предподсчёта - больше трёх лет. Это очень много.⛔️

Код Рекурсия (Range minimum requests) 👩‍💻

Пример ввода: Пример вывода:
5 3
1 3 2 4 5
1 3 1
2 4 2
3 5 2
Please open Telegram to view this post
VIEW IN TELEGRAM
👋 September 28 at 18:00.

Java 21 is coming with many new features, two of which will have a tremendous impact on the way you write Java code. This session covers these significant topics:

💪virtual threads and pattern matching that enables data-oriented programming for the Java platform. First, you'll learn how virtual threads fix several problems with the executor service pattern and propose an alternative programming model to asynchronous programming.

⬇️This model lowers the maintenance cost of your application code and also improves its observability.

😳Then, you'll see how data-oriented programming can improve the quality of your architecture. It is an alternative to object-oriented programming, a paradigm on which Java has been built from the beginning. It relies on three features: sealed classes, records, and pattern matching. Records and sealed classes are already final features, whereas pattern matching is still under work, with some elements already there and more to come.

👍Speaker: José Paumard.

Link to the broadcast.
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Бинарный поиск.📖

Дан массив длиной в n. В массиве числа расположены по возрастанию. Для заданного числа Х требуется найти номер ячейки с ним.

Алгосложность. Запускаем наш алгоритм на промежутке всего массива. На каждом шаге мы смотрим только на один серединный элемент, после чего уменьшаем размер промежутка в два раза.
👍Время работы O(log n),
а не O(n), что гораздо быстрее.⚡️
Код Бинарный поиск 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 SQRT-декомпозиция (Square Root Decomposition) - это метод решения задач на диапазонах, который заключается в разбиении исходного массива на блоки фиксированного размера и предварительной обработке каждого блока. Это позволяет быстро отвечать на запросы, связанные с диапазонами.
Код SQRT-декомпозиция.👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Задача на нахождение количество островов в заданной матрице. Где остров 1, а вода 0.
Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
💡👩‍💻 Сортировка пузырьком (Bubble Sort). Это один из самых простых алгоритмов сортировки, который проходит по массиву несколько раз, сравнивая каждую пару элементов и меняя их местами, если они не отсортированы.

Сложность алгоритма O(n^2), что делает его неэффективным для больших массивов⛔️
Please open Telegram to view this post
VIEW IN TELEGRAM
👋
Как спроектировать класс, обладающий следующими свойствами:

➡️Имеет всего ОДИН объект на всю программу. Статичные поля и методы?

➡️Мы хотим всю мощь ООП.
Полиморфизм и всё то, для чего статичность членов класса не подойдёт.

☝️Такое часто нужно для представления какого-то ресурса, общего для всей программы (база данных, система оплаты), а также когда нужны глобальные объекты, (учёт глобальной квоты для каких-то действий).

💡ОТВЕТ: это можно сделать через шаблон проектирования Singleton (с анг. одиночка).

➡️Мы хотим сконструировать объект класса A, общий для всей программы.

➡️Скрываем все конструкторы нашего класса, чтобы программист не смог создать объект через new.

➡️Вместо конструктора даём программисту статичный метод для получения объекта, в нём контролируем чтобы объект был всегда один и тот же.

➡️Этот единственный объект храним в статичном поле нашего класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
😃 Лайфхак от джавы: можно сделать Singleton через енам!

👍 Джава сама следит, что объектов у енама столько, сколько перечислено у него самого.

👍 Также автоматически получаем потокобезопасность (на случай многопоточного использования шаблона, это удобно).

👎 Меньше гибкости, так как енам делает нашу работу по реализации синглтона за нас.
Please open Telegram to view this post
VIEW IN TELEGRAM
🦾 Singleton

Программа, которая будет каждый свой шаг логгировать в консоль, но не через System.out.println, а через объект-логгер нашего собственного класса-синглтона.

⚙️ Функционал программы:
Программа начинает с приветствия, просит указать два числа: размер списка N и верхнюю границу значений элементов в списке M.
Затем она создаёт список ArrayList из N элементов и заполняет их случайными числами от 0 до M.
После этого программа запрашивает у пользователя ввести число f для фильтрации списка.
Далее программа вызывает метод List<Integer> filterOut(List<Integer> list) у объекта filter, передавая в качестве параметра созданный случайный список.
Этот метод возвращает список, в котором остаются только элементы, которые больше или равны f.
И, наконец, программа выводит итоговый список на экран и завершает свою работу.


🗂 Формат сообщения: [<дата и номер сообщения>] <текст сообщения>, где <номер сообщения> это порядковый номер выводимого логгером сообщения, а <текст сообщения> это значение параметра msg.

🙂 Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🌐 Клиент-серверное приложение

Создадим сервер, используя ServerSocket, который будет способен принимать входящие подключения. Для этого создадим отдельное приложение-клиент, с ещё одним методом main в другом классе, который будет выполняться параллельно во время работы сервера.

☝️Класс ServerSocket предоставляет инструменты для создания серверных приложений, которые могут принимать входящие сетевые соединения от клиентов.

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💻 Интерфейс List

💡Использование интерфейса List позволяет работать с коллекциями, где порядок элементов имеет значение, например, со списками или массивами.

⚙️ Интерфейс List определяет методы для добавления, удаления, изменения и получения элементов по индексу, а также для поиска элементов по значению.
⬇️ Кроме того, интерфейс List предоставляет возможность использовать итераторы для перебора элементов коллекции в определенном порядке.

📝 Может быть использован для создания собственных классов-списков, которые будут реализовывать его методы и позволят использовать эти классы вместе с другими классами-списками.
Представляет собой упорядоченный список элементов.

🧑‍💻 Давайте разработаем программу, которая позволит вам сохранить список задач. Мы можем использовать как массив, так и ArrayList для хранения этого списка. Массив имеет фиксированную длину, и после его создания вы не можете изменить его размер, тогда как ArrayList может динамически изменять свой размер во время выполнения программы, и вам не нужно заранее указывать его размер при создании.

Решение 🧠 GitLab 👩‍💻, описание в README.
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻1
💬 JPoint 2023 TechRadar: Spring

С каким проблемами мы сталкиваемся при переходе на Spring Boot 3?

Использует ли кто-то в 2023 году Spring без Spring Boot?

Вытеснят ли новомодные OpenAPI и GraphQL наши любимые JSON через HTTP?

🆕 Что новенькое в Spring и Spring Boot стоит посмотреть в 2023 году?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔗 Здесь интересная информация с примерами кода.
Спикер: Семён Киреков.
⭐️ Прошел путь от Junior Java Dev, до Team Lead за 2.5 года.
⭐️ Декан Java Faculty в MTS Teta.

Темы доклада:
📌 Что такое паттерн Value Object?
📌 Как внедрить Value Object в стеке Spring/Hibernate?
📌 Что о Value Object думают признанные эксперты в IT-индустрии?
📌 Когда применение Value Object может помешать дальнейшей разработке?

Код: GitHub 👩‍💻.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👩‍💻 IntelliJ IDEA предлагает множество сокращений для ускорения написания кода.
Вот некоторые из них:

⭐️ Сокращения для создания кода:
- psvm - создает метод public static void main(String[] args)
- sout - создает выражение System.out.println()
- fori - создает цикл for с индексом
- ifn - создает условное выражение if (value == null)

⭐️ Сокращения для редактирования кода:
- Ctrl + Space - автодополнение кода
- Ctrl + Alt + L - форматирование кода
- Ctrl + Alt + O - оптимизация импортов
- Ctrl + D - дублирование строки или выделенного блока кода

⭐️ Сокращения для навигации по коду:
- Ctrl + B - переход к определению переменной или метода
- Ctrl + F12 - открытие списка методов и переменных класса
- Alt + Left/Right - переключение между открытыми файлами

⭐️ Сокращения для работы с Git:
- Ctrl + K - коммит изменений
- Ctrl + Shift + K - пуш изменений в удаленный репозиторий
- Ctrl + Shift + A - быстрый доступ к командам Git
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👋 Алгоритм Рабина-Карпа.

📖 Он принимает две строки - текст и шаблон, и ищет все вхождения шаблона в текст. Если шаблон найден, он выводит позицию, с которой начинается каждое вхождение.

⚙️ Алгоритм Рабина-Карпа использует хеширование для быстрого сравнения подстроки с шаблоном. Он вычисляет хеш-значение для шаблона и первой подстроки текста, а затем сравнивает их. Если хеш-значения совпадают, он проверяет каждый символ шаблона и текста поочередно, чтобы убедиться, что они полностью совпадают.

⬇️ Если символы не совпадают, алгоритм переходит к следующей подстроке текста, вычисляет ее хеш-значение и сравнивает его с хеш-значением шаблона.
💡Это позволяет избежать полного сравнения каждой подстроки со всем шаблоном и значительно ускоряет процесс поиска.

🗂 Код также использует модульную арифметику для обработки хеш-значений и предотвращения переполнения.

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
😎 Программа-магазин Apple Store 🍏. У пользователя есть возможность заказать товары.

🗂 Правило Magic (Magic Number Rule) гласит, что числа не должны использоваться напрямую в коде, без объяснения их значения. Вместо этого следует использовать константы или переменные с понятными именами, чтобы код был более читаемым и поддерживаемым.

📲 Принцип DRY (Don't Repeat Yourself) означает, что в коде не должно быть повторений одинаковой или похожей логики. Вместо этого следует выносить повторяющийся код в отдельные функции, классы или модули, чтобы избежать дублирования и упростить поддержку и изменение кода.

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩1