Цель курса - проверить логические и алгоритмические способности ученика заниматься профессиональным программированием. Кандидаты, полностью выполнившие все задания могут смело продолжать изучать программирование, так как у них есть хороший потенциал стать высококвалифицированными разработчиками ПО. Кандидатам, которые испытывают сложности в выполнении данных задач, следует обратить внимание на смежные области разработки ПО, такие как: QA Automation, аналитик, функциональный программист, support.
В курсе собраны 20 задач возрастающей сложности. Каждая задача состоит из подготовленного каркаса классов и полностью написанных автоматических тестов. То есть все задания будут автоматически проверены. В данном курсе используется подход TDD. Инструменты, необходимые для прохождения курса: Maven, Git, Java 8.
Для получения исходного кода нужно выполнить команду:
git clone git@github.com:peterarsentev/course_test.git
Проект собрать через maven. Задания курса находятся в отдельных пакетах
/src/main/java/ru/parsentev/task_XXX/package-info.java
а так же продублированы ниже.
Ученик должен ознакомиться c заданием и перейти к реализации недостающего кода и классов. После завершения реализации ученик должен зайти в папку
/src/test/java/ru/parsentev/task_XXX/
и в каждом классе убрать аннотацию
@Ignore - это аннотация используется для игнорирования тестов.
После этого ученик должен перейти в корень проекта и выполнить команду
mvn clean test
Система сборки должна успешно пройти все тесты. Если тесты упали - необходимо поправить ваш код. Код тестов править нельзя.
В репозитории есть две ветки
- master - каркас заданий с тестами.
- solution - полностью выполненные задания с тестами.
Смотреть решения рекомендуется после успешной реализации кода и успешно пройденных тестов.
В качестве теоретического материала для подготовки к курсу следует прочитать следующие книги:
Head First Java, 2nd Edition: Kathy Sierra, Bert Bates
Алгоритмы. Руководство по разработке, Стивен С. Скиена
Темы необходимые для прохождения курса.
- Типы данных
- Арифметические операции
- Операторы условия
- Циклы
- Массивы
- Наследование
- Полиморфизм
- Инкапсуляция
- Исключения
-
Реализовать программу Calculator (калькулятор). Калькулятор должен выполнять операции: сложение, вычитание, умножение, деление, возведение в степень. При выполнении деления ввести проверку на 0. Если второй аргумент 0 - нужно выкинуть исключение java.lang.IllegalStateException
-
Реализовать класс Point (точка), описывающую точку в системе координат x, y - Point(x, y). Объект точка должен иметь методы double Point#distanceTo(Point point) - метод должен вычислять расстояние между двумя точками.
-
Реализовать класс Triangle (треугольник). Треугольник должен описываться через точки в системе координат. Объект треугольник должен иметь методы: boolean exists() - проверяет существует ли треугольник или нет. double area() - вычисляет площадь треугольника. Если треугольник не существует - выбросить исключение java.lang.IllegalStateException
-
Реализовать класс IsoscelesTriangle (равнобедренный треугольник) наследуя класс треугольник из задания 3. Дополнить поведение метода boolean exists() - true, если треугольник равнобедренный. Остальное поведение оставить прежним.
-
Реализовать класс RightTriangle (прямоугольный треугольник) наследуя класс треугольник из задания 3. Дополнить поведение метода boolean exists() - true, если треугольник равносторонний. Остальное поведение оставить прежним.
-
Реализовать класс Square (квадрат), основанный на четырех точках Point(x, y). boolean exists() - проверяет существует ли квадрат или нет.
-
Реализовать класс Expression. Класс должен принимать строку из просто математического выражения и методы double calc(). Должен поддерживать операции + - / * exp. Например, "2+2" - 4, "2-2" - 0 Если выражение не корректное выбросить исключение java.lang.IllegalStateException
-
Реализовать класс вычисляющий простые числа в диапазоне от 1 до N.
-
Реализовать метод подсчета уникальных символов в строке.
-
Реализовать методы проверки корректности открытых и закрытых скобок. Например, ()(()((()))) - true, ()) - false.
-
Задан массив чисел со значениями 0 и 1. Нужно проверить, что все значения в массиве равны 1. Например, [0, 1] - false, [1, 1] - true.
-
Задан массив чисел со значениями 0 и 1. Нужно проверить, что в массиве есть последовательности из трех и больше единиц. Например, [0, 1, 1] - false, [1, 1, 1] - true.
-
Задан числовой массив. Нужно проверить, что все значения в массиве одинаковые. Например, [0, 0, 0] - true, [1, 1, 1] - true, [0, 1, 1] - false.
-
Задано предложение. Нужно переставить слова в обратно порядке. Например, "программируй и зарабатывай" -> "зарабатывай и программируй".
-
Задан числовой массив. Нужно реализовать метод кольцевого сдвига на N. int[] shift(). Не использовать дополнительный массив. Например, [1, 2, 3, 4, 5] - shift(2) - [4, 5, 1, 2, 3]
-
Задан квадратный массив. Нужно проверить, что в нем есть выигрышные варианты для игры крестики-нолики.
-
Реализован банкомат размена денег. Автомат принимает бумажную купюру и обменивает на монеты. Метод должен возвращать список всех возможных вариантов размены купюры.
-
Задан двумерный массив, заполненный нулями и единицами. Нужно определить самое большое множество единиц. Множеством считается объединение единиц, которые находятся рядом друг с другом по горизонтали и(или) вертикали. Если они находятся рядом по диагонали - такое нахождение не учитывать.
-
Задан двумерный массив из единиц и нулей. Нужно найти минимальный путь от точки А до точки В. Двигаться можно только по единицам и только в вниз или вправо.
-
Задан одномерный массив. Нужно найти все возможные варианты перестановок этого массива.
-
Задан список скриптов с указанием их зависимостей.
1 - [2, 3], 2 - [4], 3 - [4, 5], 4 - [], 5 - []
Необходимо написать метод, который возвращает список всех скриптов, которые нужны для загрузки входящего скрипта.
Например, чтобы выполнить скрипт 1, нужно выполнить скрипт (2, 3), которые в свою очередь зависят от 4 и 5 скрипта.
List load(Map<Integer, List ds, Integer scriptId)
-
Задан двухмерный массив. Массив заполнен числами. По массиву двигается робот. Робот может двигаться вниз, вверх и вправо. Задача начальная точка и конечная. Перемещение из одной клетки в другую затрачивает энергию. Рассчитывается она разность модуля значений клеток. Например, ход из клетки 1 в 10 будет оцениваться в 9 единиц.
Необходимо написать метод, который определяет наименее трудозатратный путь.
int optimalWay(int[][] board, int sx, int sy, int fx, int fy)
[1, 2, 3] [1, 3, 6] [1, 1, 5]
start (0, 0), finish (3, 3). Ответ: 4. Путь 1 1 1 1 5
-
Задан двухмерный массив. Массив заполнен нулями и единицами. Робот может ходить только по единицам. Задача начальная и конечная точка. Робот может ходить вверх, вних, влево и вправо. Необходимо найти минимальный путь до конечной точки.
int minWay(int[][] board, int sx, int sy, int fx, int fy)