Практика
Задачи, подборки и прогресс в одном спокойном учебном потоке.
2. findMinMax
Реализуйте findMinMax(arr): верните объект с собственными полями min и max, содержащими наименьшее и наибольшее значения массива.
arr - массив конечных чисел JavaScript, возможны повторы, отрицательные и дробные значения. Для одного элемента оба поля равны этому элементу. Для пустого массива оба поля присутствуют со значением undefined.
Функция возвращает объект без вывода в консоль; порядок его полей значения не имеет.
Пример
findMinMax([3, 1, 4, 2]) // {min: 1, max: 4}
Функция, возвращающая HelloWorld (Create Hello World Function)
Создайте HelloWorld(), возвращающую функцию. Вложенная функция принимает любые аргументы и всегда возвращает строку "HelloWorld". Повторные вызовы и аргументы на результат не влияют.
Сигнатура
function HelloWorld()
Пример
const f = HelloWorld();
f(); // "HelloWorld"
f(1, "x"); // "HelloWorld"
Степени чисел списковым включением
Реализуйте generate_powers(), возвращающую плоский список степеней каждого числа от 1 до 4: сначала степени 1, 2, 3 числа 1, затем те же степени числа 2 и так далее. Используйте одно списковое включение (list comprehension). Каждый вызов возвращает новый список.
Сигнатуры
def generate_powers():
...
Пример
generate_powers()
# [1, 1, 1, 2, 4, 8, 3, 9, 27, 4, 16, 64]
События с подпиской и отпиской (EventEmitter)
Реализуйте EventEmitter с методами on(eventName, callback), off(eventName, callback) и emit(eventName, ...args). Подписки вызываются синхронно в порядке регистрации с аргументами emit. Повторная регистрация одного callback создает отдельный вызов; off удаляет все его регистрации для данного события. Неизвестное событие ничего не вызывает. Имена событий могут быть строками или символами и другими значениями. Изменение подписок во время emit и исключения обработчиков не проверяются; возвращаемые значения методов не проверяются.
Интерфейс
class EventEmitter {
on(eventName, callback) { /* TODO */ }
off(eventName, callback) { /* TODO */ }
emit(eventName, ...args) { /* TODO */ }
}
Пример
const e = new EventEmitter();
e.on("hello", console.log);
e.emit("hello", 1, 2); // печатает 1 2
Генератор первых чисел Фибоначчи
Реализуйте генератор fibonacci(n), последовательно выдающий первые n чисел Фибоначчи, начиная с 0,1. Каждое следующее число - сумма двух предыдущих. n - целое от 0 до 1000; при нуле генератор пуст. После n элементов он завершается; экземпляры независимы.
Сигнатуры
def fibonacci(n: int):
...
Пример
list(fibonacci(7))
# [0, 1, 1, 2, 3, 5, 8]
Сумма результатов двух промисов (Add Two Promises)
Даны два промиса с числовыми результатами. Реализуйте sumPromises1(promise1, promise2), возвращающую промис с суммой. Если любой вход отклоняется, результат отклоняется с той же причиной. Порядок завершения входов произвольный.
Сигнатура
async function sumPromises1(promise1, promise2)
Пример
await sumPromises1(Promise.resolve(2), Promise.resolve(5)); // 7
Сумма десятичных цифр числа
Верните сумму десятичных цифр целого конечного числа num типа Number. Отрицательные числа обрабатывайте по модулю; для 0 результат равен 0.
Сигнатура
function sumOfNumber(num)
Пример
sumOfNumber(123); // 6
sumOfNumber(-987); // 24
Пропущенное число (Missing Number)
Дан список nums из n различных целых чисел из диапазона [0, n]; ровно одно число диапазона пропущено. Реализуйте missing_number(nums), которая возвращает это число.
0 <= n <= 10^5; для пустого списка ответ0.- Порядок чисел произвольный.
Пример
missing_number([3, 0, 1]) # 2
missing_number([0, 1]) # 2
3. removeEvenIndexedElements
Реализуйте removeEvenIndexedElements(arr): удалите из переданного массива элементы, стоявшие на четных индексах исходного массива: 0, 2, 4 и так далее.
Индексация начинается с нуля. Сохраните порядок элементов с исходными индексами 1, 3, 5 и так далее. Элементами могут быть любые значения JavaScript; плотный массив не содержит пропущенных индексов.
Измените сам входной массив и верните ссылку на него. Не заменяйте элементы-контейнеры копиями. Для пустого входа верните тот же пустой массив; единственный элемент удаляется. Печатать внутри функции не требуется.
Пример
const arr = ['A', 'B', 'C', 'D', 'E'];
removeEvenIndexedElements(arr) // ['B', 'D'], и arr теперь также ['B', 'D']
1. Факториал
Постановка задачи:
Реализовать функцию для вычисления факториала числа n. Факториал определяется как произведение всех целых чисел от 1 до n, а факториал 0 равен 1. Решение должно быть представлено в трех вариантах:
- Итеративный способ с использованием цикла.
- Рекурсивный способ.
- Использование метода reduce для функционального подхода.
Рекурсивная сумма вложенных массивов
Напишите функцию sum, которая принимает массив чисел, в том числе содержащий вложенные массивы, и возвращает сумму всех чисел в массиве. Для обработки вложенных массивов используйте рекурсию. Массивы плотные, конечной глубины, без циклов; все числа и их сумма конечны. Сумма пустой структуры равна 0.
Сигнатура
function sum(arr)
Пример
sum([1, [2, -3], [4, [5, -6]], 7]); // 10
Позиция вставки (Search Insert Position)
Реализуйте search_insert(nums,target). nums - отсортированный по неубыванию список целых чисел. Верните индекс первого элемента, не меньшего target, либо длину списка, если такого элемента нет. Это позиция вставки перед равными элементами.
Пустой список дает 0; вход не меняется. Требуется O(log n) времени; до 100000 элементов.
Сигнатуры
def search_insert(nums: list[int], target: int) -> int:
...
Пример
search_insert([1, 3, 3, 5], 3)
# 1
2. Цепочка из 3 промисов
Постановка задачи:
Реализуйте цепочку из трёх промисов с задержкой в 3 секунды на каждом этапе. Для этого необходимо:
- Написать функцию multiplyByThree, которая принимает число, через 3 секунды умножает его на 3 (обратите внимание, в коде умножение происходит на 2, что может быть ошибкой) и возвращает результат в виде промиса.
- Сформировать цепочку промисов, где:
- Первый промис обрабатывает начальное число.
- Результат каждого промиса передаётся следующему.
- После третьего промиса результат выводится в консоль.
- Реализовать данное поведение двумя способами:
- С использованием метода then.
- С использованием синтаксиса async/await.
Эта задача демонстрирует работу с цепочками асинхронных операций и позволяет сравнить подходы с использованием then и async/await.
Повторение строки методом repeatify
Добавьте метод String.prototype.repeatify(count), возвращающий строку, повторенную count раз. count - число. Если count > 0, количество повторов равно ceil(count), иначе 0; если результат не помещается в строку JavaScript, допустима RangeError. Исходную строку не меняйте. При count = 0 результат пуст.
Сигнатура
String.prototype.repeatify = function(count)
Пример
"123".repeatify(3); // "123123123"
"x".repeatify(0); // ""
Разворот массива символов (Reverse String)
Переверните массив символов s на месте. Исходная ссылка на массив должна видеть обратный порядок. Элемент - отдельная строка, в том числе символ Unicode. Функция ничего не возвращает (undefined). Пустой массив допустим.
Сигнатура
function reverseString(s)
Пример
const s = ["h", "e", "l", "l", "o"];
reverseString(s);
console.log(s); // ["o", "l", "l", "e", "h"]
3. largestPossibleNumber
Постановка задачи:
Дано целое число n. Требуется переставить его цифры так, чтобы получить наибольшее возможное число.
4. reverseNumber
Постановка задачи:
Реализовать функцию, которая принимает целое число и возвращает его развернутый вариант, сохраняя знак (+ или -). Например, 123 превращается в 321, а -456 в -654.
4. Concatenation of Array
Реализуйте getConcatenation(nums): верните новый массив, в котором все элементы nums расположены два раза подряд в исходном порядке.
nums - массив конечных чисел JavaScript. Повторы, отрицательные числа, ноль и дроби допустимы. Результат должен иметь длину, равную удвоенной длине входа. Не чередуйте две копии по отдельным элементам.
Для пустого входа верните новый пустой массив. Функция возвращает массив без вывода в консоль.
Пример
getConcatenation([1, 2, 1]) // [1, 2, 1, 1, 2, 1]
5. Contains Duplicate
Реализуйте containsDuplicate(nums): верните true, если одно числовое значение встречается в массиве не менее двух раз, иначе false.
nums - массив конечных чисел JavaScript. Равенство определяется числовым значением, поэтому 0 и -0 считаются равными. Повторы могут находиться в любых позициях, не только рядом.
Пустой массив и массив из одного элемента не содержат дубликатов. Функция возвращает булево значение без вывода в консоль.
Пример
containsDuplicate([1, 2, 3, 4, 2]) // true
Замена элементов массива по правилам FizzBuzz
Верните новый массив: целые числа, кратные 15, замените на "FizzBuzz", кратные только 3 - на "Fizz", кратные только 5 - на "Buzz", остальные сохраните. Элементы массива - числа JavaScript.
Сигнатура
function fizzBuzz(numbers)
Пример
fizzBuzz([1, 2, 3, 4, 5, 15]); // [1, 2, "Fizz", 4, "Buzz", "FizzBuzz"]