Дан массив целых чисел nums, верните количество самых длинных строго возрастающих подпоследовательностей.
Пример:
Input: n = 1, presses = 1 Output: 2 Explanation: Status can be: - [off] by pressing button 1 - [on] by pressing button 2
Алгоритм:
1⃣Объявите два массива динамического программирования length и count, и инициализируйте их значениями length[i]=1 и count[i]=1. Итерируйте i от 0 до n−1. Для каждого i итерируйте j от 0 до i−1 и, если nums[j] < nums[i], обновите length[i] и count[i] в зависимости от значений length[j] и count[j].
2⃣Найдите максимальное значение в массиве length и сохраните его в переменной maxLength. Инициализируйте переменную result = 0.
3⃣Итерируйте i от 0 до n−1 и, если length[i] = maxLength, добавьте count[i] к result. Верните result.
Решение:
class Solution { public int findNumberOfLIS(int[] nums) { int n = nums.length; int[] length = new int[n]; int[] count = new int[n]; Arrays.fill(length, 1); Arrays.fill(count, 1);
for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { if (nums[j] < nums[i]) { if (length[j] + 1 > length[i]) { length[i] = length[j] + 1; count[i] = 0; } if (length[j] + 1 == length[i]) { count[i] += count[j]; } } } }
int maxLength = Arrays.stream(length).max().getAsInt(); int result = 0;
for (int i = 0; i < n; i++) { if (length[i] == maxLength) { result += count[i]; } }
Blue-green deployment - это стратегия развертывания, при которой две среды (синяя и зелёная) работают параллельно. Новая версия приложения разворачивается в зелёной среде, тестируется, а затем весь трафик переключается на неё, превращая её в новую продакшн-среду.
jaz — новый инструмент запуска JVM, оптимизированный под Azure. Он предлагает более подходящие настройки по умолчанию для Java-приложений в контейнерах и на виртуалках.
И это ещё не всё — впереди больше обновлений. подробнее
#статьи 😅Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. источник
Thread.getState() позволяет получить текущее состояние потока. Это полезно при отладке многопоточных программ, чтобы отслеживать, выполняется ли поток, заблокирован или завершён. 👉Новости👉База вопросов
Контейнер - это легковесный, изолированный пакет, содержащий код приложения, зависимости и настройки. Он позволяет запускать приложения независимо от среды, упрощая их развертывание и масштабирование.
#полезное 😇Java Lombok: Аннотация @Data — всё в одном
Аннотация @Data объединяет в себе несколько часто используемых аннотаций Lombok:
🟠@ToString — генерирует метод toString() 🟠@Getter — создаёт геттеры для всех нестатических полей 🟠@Setter — создаёт сеттеры для всех нестатических полей 🟠@EqualsAndHashCode — генерирует equals() и hashCode() 🟠@RequiredArgsConstructor — создаёт конструктор для всех final и @NonNull полей
Charset.forName() позволяет получить кодировку по её названию и использовать её для преобразования строк. Это полезно при работе с различными кодировками, например, UTF-8, ISO-8859-1 и Windows-1251. 👉Новости👉База вопросов
Jenkinsfile - это текстовый файл, в котором описаны этапы CI/CD-пайплайна: сборка, тестирование, развертывание. Он позволяет управлять процессами Jenkins с помощью кода, обеспечивая прозрачность и повторяемость.
В новой версии JDK 25 улучшили производительность класса String: теперь метод String::hashCode в большинстве случаев сворачивается на этапе компиляции (constant folding).
Это значит: – Меньше затрат в рантайме – Быстрее работа с ключами в HashMap – Эффективнее часто используемые строки Подробнее
Используйте @FunctionalInterface как защиту на уровне компиляции
Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным. Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку
ScopedValue.where() позволяет безопасно передавать контекстные данные внутри потока, избегая утечек памяти и сложностей ThreadLocal. Данные доступны только внутри заданного блока кода.
#полезное 🫡В этом гайде автор показывает, как парсить структурированные строки в Java
Большинство разработчиков используют регулярные выражения, split() или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции. Класс StringFormat делает парсинг настолько простым, что даже новичок может реализовать его в одну строку.
#статьи 😊В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot
Многие разработчики либо перегружают @SpringBootTest, либо пишут сложные конструкции с @MockBean. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.
Класс MockMvc и аннотация @WebMvcTest делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.
#полезное 😊Совет по Java: предпочитай внедрение через конструктор, а не через поля
На то есть разные причины:
🟠 Зависимости можно пометить как final, гарантируя, что они не изменятся после создания.
🟠 Повышает надёжность класса и безопасность при работе с потоками
🟠 Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
🟠 Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
🟠 Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
🟠 Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
TerminalBuilder.build() из библиотеки JLine позволяет создавать интерактивные терминалы с поддержкой ANSI-цветов, автодополнения и управления вводом. Это полезно для создания CLI-приложений с удобным интерфейсом. Документация 👉Новости👉База вопросов
#полезное 🥄Это просто огонь. В одном из следующих релизов jetbrains / intellijidea появится фича, которая позволяет в пару кликов сгенерировать JPA-энтити из существующей схемы БД
И ещё, мне сказали, что SpringData JDBC тоже скоро завезут