December 25, 2024

Java: middle. Практическое задание

В этой статье мы разберем практическое задание, которое демонстрирует, как эффективно работать со строками, списками и сортировками на языке Java.
Задача заключается в вычислении минимального, медианного и максимального возраста сотрудников из структурированных данных.

Текстовый файл с примерами кода задачи будет прикреплен к посту 👉Telegram

Задача 1

Проверка на палиндром
Вы разрабатываете программу для проверки строк на палиндромы. Палиндромом называется строка, которая читается одинаково как с начала, так и с конца. При этом пробелы и регистр букв игнорируются.

Напишите программу, которая определяет, является ли заданная строка палиндромом.

Формат ввода
Одна строка, содержащая только заглавные и/или строчные буквы русского алфавита и, в некоторых случаях, пробелы. Длина строки от 2 до 100 символов включительно.

Формат вывода
Одна из двух фраз (без кавычек): «Палиндром» или «Не палиндром».

Пример 1

Входные данные:
Тут как тут
Выходные данные:
Палиндром

Пример 2

Входные данные:
Программист
Выходные данные:
Не палиндром

Код:

Объяснение:

Очистка ввода:

  • replaceAll("\\s+", "") удаляет все пробелы.
  • toLowerCase() переводит все символы в нижний регистр для игнорирования регистра.

Техника двух указателей:

  • Используйте два указателя (левый и правый), которые начинают проверку с начала и конца строки.
  • Сравнивайте символы и сдвигайте указатели навстречу друг другу.
  • Если пара символов не совпадает, вернуть «Не палиндром».

Подтверждение палиндрома:

  • Если все символы совпадают, вернуть «Палиндром».

Примеры тестовых случаев:

  • Ввод: Тут как тут → Вывод: Палиндром
  • Ввод: Программист → Вывод: Не палиндром
  • Ввод: шалаш → Вывод: Палиндром


Задача 2

Значительное похолодание
Вы разрабатываете приложение для определения погоды. Вы работаете с массивом значений температур по дням. В нем вам нужно найти значительные падения температуры — дни, когда температура упала на 3 и более градуса относительно предыдущего значения. Температура может принимать положительные, нулевые и отрицательные значения.

Формат ввода
Одна строка, в которой чередуются целые числа, разделенные пробелами. Числа могут быть положительными, отрицательными или нулем. Длина списка — не больше 100 элементов.

Формат вывода
Одна строка, в которой чередуются целые числа, разделенные пробелами. В строке содержатся индексы дней, соответствующие определению «значительное падение температуры». Если таких дней нет, выводится «Нет».

Пример 1

Входные данные:
0 5 2 7 4 1
Выходные данные:
2 4 5

Пример 2

Входные данные:
10 8 6 4 2 0 -2 -4
Выходные данные:
Нет

Код:

Объяснение:

Разбор ввода:

  • Разделите входную строку на отдельные числа с помощью split(" ").
  • Преобразуйте каждое строковое число в целое число с помощью Integer.parseInt.

Логика значительного падения:

  • Сравнивайте каждую пару последовательных температур: предыдущая - текущая.
  • Если разница составляет 3 или более, добавьте индекс текущего дня (начиная с 1) в результат.

Построение результата:

  • Используйте StringBuilder для эффективного формирования выходной строки.
  • Если значительных падений не найдено, верните «Нет».

Форматирование вывода:

  • Удалите все завершающие пробелы с помощью trim().


Задача 3

Только безопасные пароли
Вы разрабатываете программу для проверки безопасности паролей. Ваша задача — проверить набор паролей и определить, какие из них безопасны. Пароль считается таковым, если он удовлетворяет пяти условиям:

  1. Содержит хотя бы одну заглавную букву;
  2. Содержит хотя бы одну строчную букву;
  3. Содержит хотя бы одну цифру;
  4. Содержит хотя бы один специальный символ (допустимый набор символов: !@#$%^&*()-+);
  5. Длина пароля больше или равна 8 символам.

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

Формат ввода
Одна строка, в которой чередуются пароли, разделенные пробелами. Длина строки — не более 100 символов.

Формат вывода
Одна строка, в которой содержатся только безопасные пароли, разделенные пробелами. Выводите пароли в том порядке, в котором они были даны на вход. Если подходящих паролей нет, выводите «Не найдено» (без кавычек).

Пример 1

Входные данные:
Password1 Pass@word 12345 pass!word Passw@rd Password1!
Выходные данные:
Password1!

Пример 2

Входные данные:
Password1 Pass@word 12345 pass!word
Выходные данные:
Не найдено

Код:

Объяснение кода:

  1. Разделение паролей: Вводная строка разделяется по пробелам на отдельные пароли.
  2. Метод isSafe:
    • Проверяет, содержит ли пароль:
      • Заглавную букву: Character.isUpperCase.
      • Строчную букву: Character.isLowerCase.
      • Цифру: Character.isDigit.
      • Специальный символ: наличие в строке specialChars.
    • Проверяется длина пароля (≥ 8 символов).
  3. Добавление в результат: Только пароли, прошедшие проверку, добавляются в строку результата.
  4. Вывод:
    • Если безопасных паролей нет, возвращается "Не найдено".
    • Иначе выводятся все безопасные пароли через пробел.

Тесты:

Пример 1

Вход: Password1 Pass@word 12345 pass!word Passw@rd Password1!
Выход: Password1!

Пример 2

Вход: Password1 Pass@word 12345 pass!word
Выход: Не найдено

Пример 3

Вход: yB3Fn9e^gGV% Ps3JQE(E-#*& YH^U#PlAiE&8 gOEzfMrHR+fb aAlBW$B0p@ua
Выход: yB3Fn9e^gGV% Ps3JQE(E-#*& YH^U#PlAiE&8 gOEzfMrHR+fb aAlBW$B0p@ua


Задача 4

Список задач по приоритету
Вы разрабатываете программу для управления задачами в списке дел. Сначала вам необходимо реализовать односвязный список, который будет хранить задачи. Каждая задача имеет название и приоритет.

Затем реализуйте методы для управления задачами: добавление задачи в список, удаление задачи из списка и вывод всех задач. Из списка всегда удаляется наиболее приоритетная задача, вывод задач также отсортирован по приоритету.

Формат ввода
Одна строка, которая содержит команды и их параметры (если есть). Команды разделены через точку с запятой, параметры — через запятую.

Команды могут быть следующими:

  1. ADD,название_задачи,приоритет_задачи — добавление новой задачи в список;
  2. REMOVE — удаление наиболее приоритетной задачи из списка. Если несколько задач имеют одинаковый приоритет, удаляется первая по алфавиту задача. Если задач в списке нет, ничего не происходит.
  3. Набор команд гарантированно заканчивается командой GET — она выводит все задачи, которые остались в списке, по порядку приоритета.

Название задачи содержит только буквы кириллицы, без пробелов и иных символов. Каждое название, хранящееся в списке, уникально.
Приоритет задачи — это целое число от 1 до 5, где 1 — наиболее приоритетные, 5 — наименее приоритетные задачи.

Длина строки — не более 500 символов.

Формат вывода
Одна строка — все задачи, которые остались в списке, через точку с запятой. Строка имеет вид:
название_задачи,приоритет_задачи;название_задачи,приоритет_задачи;....
Задачи отсортированы от наиболее к наименее приоритетным (от 1 до 5) с учетом алфавитного порядка для одинаковых приоритетов.

Если в списке не осталось задач, выводится «Список пуст» (без кавычек).

Пример 1

Входные данные:
ADD,НаписатьКод,2;ADD,ТестироватьКод,3;ADD,ОтветитьНаСообщения,1;REMOVE;GET
Выходные данные:
НаписатьКод,2;ТестироватьКод,3

Пример 2

Входные данные:
REMOVE;ADD,КупитьПродукты,3;REMOVE;ADD,СделатьУборку,2;ADD,Постирать,5;ADD,Погладить,5;GET
Выходные данные:
СделатьУборку,2;КупитьПродукты,3;Погладить,5;Постирать,5

Пример 3

Входные данные:
ADD,ПосетитьВыставку,2;REMOVE;ADD,ПрочитатьГазету,1;REMOVE;GET
Выходные данные:
Список пуст

Код:

Часть 1
Часть 2

Объяснение кода:

  1. Структура данных:
    • Используется PriorityQueue для хранения задач, где задачи сортируются по приоритету.
    • Если приоритеты равны, задачи сортируются по алфавиту.
  2. Команды:
    • ADD: Добавляет новую задачу в очередь.
    • REMOVE: Удаляет задачу с наивысшим приоритетом.
    • GET: Составляет строку с оставшимися задачами.
  3. Вывод:
    • Если очередь пустая, возвращается "Список пуст".
    • Оставшиеся задачи сортируются и объединяются в строку формата название_задачи,приоритет.

Основные ошибки:

  1. Проблема завершения кода:
    • Ошибка была из-за неправильного завершения result – теперь используется корректное формирование результата через StringBuilder.
  2. Удаление последнего символа:
    • В методе вывода результата используется result.substring(0, result.length() - 1) для удаления последнего ;.
  3. Сортировка:
    • Задачи сортируются в списке перед формированием результата.

Результат

Пример 1

Вход:
ADD,СделатьОтчет,4;ADD,ПровестиПрезентацию,2;ADD,НаписатьДокументацию,2;ADD,ОтправитьЧек,2;REMOVE;GET

Выход:
ОтправитьЧек,2;ПровестиПрезентацию,2;СделатьОтчет,4

Пример 2

Вход:
ADD,ПосетитьВстречу,2;REMOVE;ADD,ПрочитатьГазету,1;REMOVE;GET

Выход:
Список пуст

Пример 3

Вход:
ADD,НаписатьКод,2;ADD,ТестироватьКод,3;ADD,ОтветитьНаСообщения,1;REMOVE;GET

Выход:
НаписатьКод,2;ТестироватьКод,3

Следите за обновлениями и удачного программирования! 🚀