К основному содержимому
Библиотека обучения · практика и теория

Практика

Задачи, подборки и прогресс в одном спокойном учебном потоке.

2 742
материалов
По популярностиБез фильтров

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"]