Java: middle. Практическое задание
В этой статье мы разберем практическое задание, которое демонстрирует, как эффективно работать со строками, списками и сортировками на языке Java.
Задача заключается в вычислении минимального, медианного и максимального возраста сотрудников из структурированных данных.
Текстовый файл с примерами кода задачи будет прикреплен к посту 👉Telegram
Задача 1
Проверка на палиндром
Вы разрабатываете программу для проверки строк на палиндромы. Палиндромом называется строка, которая читается одинаково как с начала, так и с конца. При этом пробелы и регистр букв игнорируются.
Напишите программу, которая определяет, является ли заданная строка палиндромом.
Формат ввода
Одна строка, содержащая только заглавные и/или строчные буквы русского алфавита и, в некоторых случаях, пробелы. Длина строки от 2 до 100 символов включительно.
Формат вывода
Одна из двух фраз (без кавычек): «Палиндром» или «Не палиндром».
Входные данные:
Тут как тут
Выходные данные:
Палиндром
Входные данные:
Программист
Выходные данные:
Не палиндром
replaceAll("\\s+", "")
удаляет все пробелы.toLowerCase()
переводит все символы в нижний регистр для игнорирования регистра.
- Используйте два указателя (левый и правый), которые начинают проверку с начала и конца строки.
- Сравнивайте символы и сдвигайте указатели навстречу друг другу.
- Если пара символов не совпадает, вернуть «Не палиндром».
- Ввод: Тут как тут → Вывод: Палиндром
- Ввод: Программист → Вывод: Не палиндром
- Ввод: шалаш → Вывод: Палиндром
Задача 2
Значительное похолодание
Вы разрабатываете приложение для определения погоды. Вы работаете с массивом значений температур по дням. В нем вам нужно найти значительные падения температуры — дни, когда температура упала на 3 и более градуса относительно предыдущего значения. Температура может принимать положительные, нулевые и отрицательные значения.
Формат ввода
Одна строка, в которой чередуются целые числа, разделенные пробелами. Числа могут быть положительными, отрицательными или нулем. Длина списка — не больше 100 элементов.
Формат вывода
Одна строка, в которой чередуются целые числа, разделенные пробелами. В строке содержатся индексы дней, соответствующие определению «значительное падение температуры». Если таких дней нет, выводится «Нет».
Входные данные:
0 5 2 7 4 1
Выходные данные:
2 4 5
Входные данные:
10 8 6 4 2 0 -2 -4
Выходные данные:
Нет
- Разделите входную строку на отдельные числа с помощью
split(" ")
. - Преобразуйте каждое строковое число в целое число с помощью
Integer.parseInt
.
- Сравнивайте каждую пару последовательных температур: предыдущая - текущая.
- Если разница составляет 3 или более, добавьте индекс текущего дня (начиная с 1) в результат.
- Используйте
StringBuilder
для эффективного формирования выходной строки. - Если значительных падений не найдено, верните «Нет».
Задача 3
Только безопасные пароли
Вы разрабатываете программу для проверки безопасности паролей. Ваша задача — проверить набор паролей и определить, какие из них безопасны. Пароль считается таковым, если он удовлетворяет пяти условиям:
- Содержит хотя бы одну заглавную букву;
- Содержит хотя бы одну строчную букву;
- Содержит хотя бы одну цифру;
- Содержит хотя бы один специальный символ (допустимый набор символов:
!@#$%^&*()-+
); - Длина пароля больше или равна 8 символам.
Реализуйте метод, который принимает на вход один пароль и проверяет его на соответствие условиям. Проверьте каждый пароль в наборе с помощью этого метода и верните только безопасные пароли.
Формат ввода
Одна строка, в которой чередуются пароли, разделенные пробелами. Длина строки — не более 100 символов.
Формат вывода
Одна строка, в которой содержатся только безопасные пароли, разделенные пробелами. Выводите пароли в том порядке, в котором они были даны на вход. Если подходящих паролей нет, выводите «Не найдено» (без кавычек).
Входные данные:
Password1 Pass@word 12345 pass!word Passw@rd Password1!
Выходные данные:
Password1!
Входные данные:
Password1 Pass@word 12345 pass!word
Выходные данные:
Не найдено
Объяснение кода:
- Разделение паролей: Вводная строка разделяется по пробелам на отдельные пароли.
- Метод
isSafe
: - Проверяет, содержит ли пароль:
- Заглавную букву:
Character.isUpperCase
. - Строчную букву:
Character.isLowerCase
. - Цифру:
Character.isDigit
. - Специальный символ: наличие в строке
specialChars
. - Проверяется длина пароля (≥ 8 символов).
- Добавление в результат: Только пароли, прошедшие проверку, добавляются в строку результата.
- Вывод:
Пример 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
Список задач по приоритету
Вы разрабатываете программу для управления задачами в списке дел. Сначала вам необходимо реализовать односвязный список, который будет хранить задачи. Каждая задача имеет название и приоритет.
Затем реализуйте методы для управления задачами: добавление задачи в список, удаление задачи из списка и вывод всех задач. Из списка всегда удаляется наиболее приоритетная задача, вывод задач также отсортирован по приоритету.
Формат ввода
Одна строка, которая содержит команды и их параметры (если есть). Команды разделены через точку с запятой, параметры — через запятую.
Команды могут быть следующими:
ADD,название_задачи,приоритет_задачи
— добавление новой задачи в список;REMOVE
— удаление наиболее приоритетной задачи из списка. Если несколько задач имеют одинаковый приоритет, удаляется первая по алфавиту задача. Если задач в списке нет, ничего не происходит.- Набор команд гарантированно заканчивается командой
GET
— она выводит все задачи, которые остались в списке, по порядку приоритета.
Название задачи содержит только буквы кириллицы, без пробелов и иных символов. Каждое название, хранящееся в списке, уникально.
Приоритет задачи — это целое число от 1 до 5, где 1 — наиболее приоритетные, 5 — наименее приоритетные задачи.
Длина строки — не более 500 символов.
Формат вывода
Одна строка — все задачи, которые остались в списке, через точку с запятой. Строка имеет вид:название_задачи,приоритет_задачи;название_задачи,приоритет_задачи;...
.
Задачи отсортированы от наиболее к наименее приоритетным (от 1 до 5) с учетом алфавитного порядка для одинаковых приоритетов.
Если в списке не осталось задач, выводится «Список пуст» (без кавычек).
Входные данные:
ADD,НаписатьКод,2;ADD,ТестироватьКод,3;ADD,ОтветитьНаСообщения,1;REMOVE;GET
Выходные данные:
НаписатьКод,2;ТестироватьКод,3
Входные данные:
REMOVE;ADD,КупитьПродукты,3;REMOVE;ADD,СделатьУборку,2;ADD,Постирать,5;ADD,Погладить,5;GET
Выходные данные:
СделатьУборку,2;КупитьПродукты,3;Погладить,5;Постирать,5
Входные данные:
ADD,ПосетитьВыставку,2;REMOVE;ADD,ПрочитатьГазету,1;REMOVE;GET
Выходные данные:
Список пуст
Объяснение кода:
- Структура данных:
- Используется PriorityQueue для хранения задач, где задачи сортируются по приоритету.
- Если приоритеты равны, задачи сортируются по алфавиту.
- Команды:
ADD
: Добавляет новую задачу в очередь.REMOVE
: Удаляет задачу с наивысшим приоритетом.GET
: Составляет строку с оставшимися задачами.- Вывод:
Основные ошибки:
- Проблема завершения кода:
- Ошибка была из-за неправильного завершения
result
– теперь используется корректное формирование результата черезStringBuilder
. - Удаление последнего символа:
- В методе вывода результата используется
result.substring(0, result.length() - 1)
для удаления последнего;
. - Сортировка:
Результат
Пример 1
Вход:ADD,СделатьОтчет,4;ADD,ПровестиПрезентацию,2;ADD,НаписатьДокументацию,2;ADD,ОтправитьЧек,2;REMOVE;GET
Выход:ОтправитьЧек,2;ПровестиПрезентацию,2;СделатьОтчет,4
Вход:ADD,ПосетитьВстречу,2;REMOVE;ADD,ПрочитатьГазету,1;REMOVE;GET
Вход:ADD,НаписатьКод,2;ADD,ТестироватьКод,3;ADD,ОтветитьНаСообщения,1;REMOVE;GET
Выход:НаписатьКод,2;ТестироватьКод,3