Разместите каждый символ по указанным индексам. Для пропущенных позиций и конфликтов нужно определить политику: ниже пробел заполняет пропуск, разные символы на одном индексе вызывают ошибку.
Конструктор строки по позиционным индексам
Разместите каждый символ по указанным индексам. Для пропущенных позиций и конфликтов нужно определить политику: ниже пробел заполняет пропуск, разные символы на одном индексе вызывают ошибку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция получает объект, где каждое свойство — это символ, а значение — массив позиций, на которых этот символ должен появиться в итоговой строке. Необходимо сформировать строку, разместив каждый символ на всех указанных в массиве позициях.
Пример входных данных:
{
"a": [0, 2],
"b": [1]
}
Ожидаемый результат: "aba".
Функция должна корректно обрабатывать любые наборы символов и индексов, гарантируя, что результирующая строка имеет длину, достаточную для размещения самого большого индекса плюс один.
Ответ
Разместите каждый символ по указанным индексам. Для пропущенных позиций и конфликтов нужно определить политику: ниже пробел заполняет пропуск, разные символы на одном индексе вызывают ошибку.
function buildString(mapping) {
const slots = new Map();
let max = -1;
for (const [char, positions] of Object.entries(mapping)) {
if ([...char].length !== 1) throw new TypeError('Ключ должен быть символом');
for (const index of positions) {
if (!Number.isSafeInteger(index) || index < 0) throw new RangeError('Неверный индекс');
if (slots.has(index) && slots.get(index) !== char) throw new Error('Конфликт позиции');
slots.set(index, char); max = Math.max(max, index);
}
}
return Array.from({ length: max + 1 }, (_, index) => slots.get(index) ?? ' ').join('');
}
Для примера результат aba. Индексы относятся к кодовым точкам, поэтому UTF-16 length строки с эмодзи может быть больше числа позиций. Практический API должен ограничить максимальный индекс по памяти; обещать работу с произвольно огромным разреженным индексом нельзя.