☝️💡Рекурсия (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
🧠 В данном коде реализован алгоритм Форда-Беллмана для нахождения кратчайших путей из одной вершины до всех остальных взвешенного ориентированного графа.

⚙️ Алгоритм работает следующим образом:
Инициализируются расстояния до всех вершин как бесконечность, кроме начальной вершины, для которой расстояние равно 0.
Проход по всем ребрам графа numVertices - 1 раз, где numVertices - количество вершин в графе.
Для каждого ребра (u, v) проверяется, если расстояние от начальной вершины до u плюс вес ребра меньше текущего расстояния до v, то обновляется расстояние до v.
После выполнения алгоритма в массиве distances будут содержаться кратчайшие расстояния от начальной вершины до всех остальных.
☝️Алгоритм имеет алгоритмическую сложность O(V * E), где V - количество вершин, E - количество ребер в графе. В данном случае алгоритм работает с матрицей смежности, поэтому сложность будет O(V^3), так как для каждой вершины происходит проверка всех возможных рёбер.

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Напишем программу для тяжелых вычислительных процессов. Клиент-серверное приложение для вычисления чисел Фибоначчи.
Смысл в том, что необходимо будет передать данные на сервер который способен выполнить нашу задачу.
Используется блокирующий ввод/вывод (Blocking IO).

🌐 Server.java:

⭐️ Создает серверный сокет, который ожидает подключений клиентов в бесконечном цикле.

⭐️ Для каждого подключения:
Создает сокет для связи с клиентом.
Использует BufferedReader для чтения данных от клиента и PrintWriter для отправки данных клиенту.
Читает сообщения от клиента, преобразует их в целые числа, вычисляет N-е число Фибоначчи с помощью метода findNFibonacciLight, и отправляет результат клиенту.
Если клиент отправляет "end", завершает цикл.


🔎 Client.java:

⭐️ Создает сокет для подключения к серверу, который работает на localhost (127.0.0.1) и порту 13301.
⭐️Использует BufferedReader для чтения данных от сервера и PrintWriter для отправки данных серверу.
⭐️ Запрашивает у пользователя ввод числа или "end" для завершения.

⭐️ Отправляет введенное сообщение серверу.

⭐️ Если введено "end", завершает цикл.

⭐️ Выводит ответ сервера на экран.

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

Используется для создания коллекции, которая представляет собой очередь элементов. Он расширяет интерфейс Collection и определяет методы для работы с очередью, такие как добавление элемента в конец очереди, удаление элемента из начала очереди, проверка наличия элемента и т.д. Очередь может быть использована для решения различных задач, таких как обработка задач в порядке их поступления, управление потоками данных в многопоточных приложениях, реализация алгоритмов поиска в ширину и т.д.
💡Использование интерфейса Queue может быть полезным при работе с потоками данных, когда необходимо управлять порядком обработки элементов или обрабатывать элементы в порядке приоритета.

⬇️ Методы:

add(E element): добавляет элемент в конец очереди, если это возможно.

offer(E element): добавляет элемент в конец очереди, если это возможно. Возвращает true, если элемент был успешно добавлен, и false в противном случае.

remove(): удаляет и возвращает элемент из начала очереди. Если очередь пуста, выбрасывает исключение NoSuchElementException.

poll(): удаляет и возвращает элемент из начала очереди. Если очередь пуста, возвращает null.

element(): возвращает элемент из начала очереди без его удаления. Если очередь пуста, выбрасывает исключение NoSuchElementException.

peek(): возвращает элемент из начала очереди без его удаления. Если очередь пуста, возвращает null.



🧠 Напишем программу которая будет считывать данные из консоли, ожидая ввода номера нужного города для построения маршрута.

⬇️ Используем методы:

offer(E e) - Для добавления элементов (чисел, представляющих города) в очередь line.

poll() - Для извлечения и удаления элементов из начала очереди line во время вывода маршрута.

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👏1
👋 Сортировка подсчетом (Counting Sort).

↔️ Используется для сортировки целых чисел в заданном диапазоне. Он создает массив счетчиков для каждого элемента в диапазоне и затем проходит по входному массиву, увеличивая соответствующий счетчик. Затем он проходит по массиву счетчиков и формирует отсортированный массив. Сложность алгоритма O(n+k), где k - размер диапазона, что делает его очень быстрым 🐆 для больших массивов, но неэффективным для маленьких.

⚙️ Алгоритм сортировки подсчетом имеет временную сложность O(n + k), где n - длина массива, k - диапазон возможных значений в массиве. В данном коде, время выполнения алгоритма зависит от максимального значения в массиве, которое находится в переменной max. Таким образом, алгоритм имеет временную сложность O(n + max).

Код: GitLab 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔃 Многопоточное программирование.

✏️Java-приложение которое создает несколько потоков выполнения и выполняет их с использованием пула потоков.

💡При запуске этого кода создаются четыре потока выполнения, каждый из которых выводит "Hello World!" с указанием своего имени, и затем выводится информация о том, сколько раз каждый поток выполнил задачу.

👨‍💻 Также выводится информация о том, сколько раз выполнение завершилось с наибольшим результатом.

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