JS: Введение в ООП Испытания
Node.js
Двоичное дерево поиска состоит из узлов, каждый из которых содержит значение ключа и два поддерева (левое и правое), которые в свою очередь также являются двоичными деревьями. Правильное дерево не содержит повторяющихся ключей, и для каждого узла гарантируется, что в левом поддереве все значения меньше текущего, а в правом — больше.
Реализуйте и экспортируйте по умолчанию класс, который реализует представление узла. Конструктор класса принимает на вход значение ключа (число), и двух детей, которые в свою очередь также являются узлами. Дерево может быть создано пустым.
Класс должен содержать методы:
- Геттер
getKey()
— возвращает ключ. Если дерево пустое, возвращаетnull
. - Геттеры
getLeft()
,getRight()
— возвращают соответственно левого и правого ребёнка. Если ребёнок в узле отсутствует, геттер возвращаетnull
. search(key)
— выполняет поиск узла в правильном двоичном дереве по ключу и возвращает узел. Если узел не найден, возвращаетсяnull
.
Примеры
const tree = new Node(9, new Node(4, new Node(3), new Node(6, new Node(5), new Node(7))), new Node(17, null, new Node(22, new Node(20), null))); const node = tree.search(6); node.getKey(); // 6 node.getLeft().getKey(); // 5 node.getRight().getKey(); // 7 tree.search(35); // null tree.search(3).getLeft(); // null
Подсказки
Успешных завершений: 86%
Двоичное дерево — иерархическая структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками.
В данном испытании мы будем использовать подвид двоичного дерева — двоичное дерево поиска. Правильное дерево не содержит повторяющихся ключей, и для каждого узла гарантируется, что в левом поддереве все значения меньше текущего, а в правом — больше.
Node.js
Реализуйте и экспортируйте по умолчанию класс, который реализует представление узла.
Класс должен содержать:
- Геттер
getKey()
— возвращает ключ. - Геттеры
getLeft()
,getRight()
— возвращают соответственно левого и правого ребёнка. Если ребёнок в узле отсутствует, геттер возвращаетnull
. - Метод
insert(key)
— выполняет добавление узла, формируя правильное двоичное дерево.
Примеры
const tree = new Node(); tree.insert(9); tree.insert(17); tree.insert(4); tree.insert(3); tree.insert(6); tree.getKey(); // 9 tree.getLeft().getKey(); // 4 tree.getRight().getKey(); // 17 tree.getLeft().getLeft().getKey(); // 3 tree.getLeft().getRight().getKey(); // 6
Подсказки
Успешных завершений: 85%
В данном испытании мы будем использовать двоичное дерево, и выполнять агрегацию данных.
Node.js
Реализуйте следующие методы в классе:
getCount()
— возвращает количество узлов в дереве.getSum()
— возвращает сумму всех ключей дерева.toArray()
— возвращает одномерный массив содержащий все ключи.toString()
— возвращает строковое представление дерева.every(fn)
— проверяет, удовлетворяют ли все ключи дерева условию, заданному в передаваемой функции.some(fn)
- проверяет, удовлетворяет ли какой-либо ключ дерева условию, заданному в передаваемой функции.
При обходе дерева нужно использовать порядок слева-направо. То есть вначале обрабатываем ключ узла, затем ключ левого ребёнка, после чего ключ правого ребёнка.
Примеры
const tree = new Node(9, new Node(4, new Node(8), new Node(6, new Node(3), new Node(7))), new Node(17, null, new Node(22, null, new Node(20)))); tree.getCount() // 9 tree.getSum(); // 96 tree.toArray(); // [9, 4, 8, 6, 3, 7, 17, 22, 20] tree.toString(); // '(9, 4, 8, 6, 3, 7, 17, 22, 20)' tree.every((key) => key <= 22); // true tree.every((key) => key < 22); // false tree.some((key) => key < 4); // true tree.some((key) => key > 22); // false
Подсказки
- Двоичное дерево
- Для реализации каждого из методов потребуется выполнить обход всех узлов дерева.
- Вспомните принцип работы метода reduce для массивов.
Успешных завершений: 81%
Сбалансированное двоичное дерево
Особенность структуры двоичного дерева даёт хороший прирост к эффективности при поиске нужного значения. Для этого нужно, чтобы двоичное дерево было сбалансированным. То есть необходимо построить дерево так, чтобы общее количество узлов в левом и правом поддеревьях было примерно одинаковым для любого узла дерева.
Node.js
Реализуйте метод isBalanced()
, который проверяет дерево на сбалансированность. Он возвращает true
, если количество узлов в левом и правом поддеревьях каждого узла отличается не более, чем на 2. В ином случае метод должен вернуть false
.
Сбалансированное дерево
Несбалансированное дерево
В узле 5
количество узлов в левом поддереве равно 4, а в правом — 1. Разница составляет 3. Это больше, чем максимально допустимая разница по условию задачи (2).
Примеры
const tree1 = new Node(4, new Node(3, new Node(2))); tree1.isBalanced(); // true const tree2 = new Node(4, new Node(3, new Node(2, new Node(1)))); tree2.isBalanced(); // false
Успешных завершений: 80%
Circle.js
Реализуйте и экспортируйте по умолчанию класс Circle
описывающий круг. У круга есть только одно свойство - его радиус. Реализуйте методы getArea()
и getCircumference()
, которые вычисляют и возвращают площадь и длину окружности соответственно.
Примеры
const circle = new Circle(3); circle.getArea(); // 28.274...
Подсказки
- Площадь круга: πr2
- Длина окружности: 2*πR
Успешных завершений: 96%
Random.js
Реализуйте генератор случайных чисел, представленный классом Random
. Интерфейс объекта включает в себя три функции:
- Конструктор. Принимает на вход seed, начальное число генератора псевдослучайных чисел.
getNext()
— метод, возвращающий новое случайное число.reset()
— метод, сбрасывающий генератор на начальное значение.
Экспортируйте класс по умолчанию.
Примеры
const seq = new Random(100); const result1 = seq.getNext(); const result2 = seq.getNext(); result1 !== result2; // true seq.reset(); const result21 = seq.getNext(); const result22 = seq.getNext(); result1 === result21; // true result2 === result22; // true
Подсказки
- Простейший способ реализовать случайные числа — линейный конгруэнтный метод.
Успешных завершений: 87%
Square.js
Реализуйте и экспортируйте по умолчанию класс Square
для представления квадрата. У квадрата есть только одно свойство — сторона. Реализуйте метод getSide()
, возвращающий значение стороны.
Пример
const square = new Square(10); square.getSide(); // 10
SquaresGenerator.js
Реализуйте класс SquaresGenerator
со статическим методом generate()
, принимающим два параметра: сторону и количество экземпляров квадрата (по умолчанию 5 штук), которые нужно создать. Функция должна вернуть массив из квадратов. Экспортируйте класс по умолчанию.
Пример
const squares = SquaresGenerator.generate(3, 2); // [new Square(3), new Square(3)];
Успешных завершений: 92%
Url.js
В данном испытании вам предстоит реализовать класс Url
, который позволяет извлекать из HTTP адреса, представленного строкой, его части. Экспортируйте класс по умолчанию.
Класс должен содержать конструктор и методы:
- конструктор - принимает на вход HTTP адрес в виде строки.
getScheme()
- возвращает протокол передачи данных (без двоеточия).getHostName()
- возвращает имя хоста.getQueryParams()
- возвращает параметры запроса в виде пар ключ-значение объекта.getQueryParam()
- получает значение параметра запроса по имени. Если параметр с переданным именем не существует, метод возвращает значение заданное вторым параметром (по умолчанию равно null).
В процессе прохождения испытания вам нужно будет хорошо поработать с документацией и изучить возможности класса URL, для того чтобы распарсить строковое представление HTTP адреса.
Примеры
const url = new Url('http://yandex.ru:80?key=value&key2=value2'); url.getScheme(); // 'http' url.getHostName(); // 'yandex.ru' url.getQueryParams(); // { // key: 'value', // key2: 'value2', // }; url.getQueryParam('key'); // 'value' // второй параметр - значение по умолчанию url.getQueryParam('key2', 'lala'); // 'value2' url.getQueryParam('new', 'ehu'); // 'ehu' url.getQueryParam('new'); // null
Подсказки
- Не используйте в решении устаревшие возможности (Legacy URL API).
Успешных завершений: 82%