Храните предыдущий символ и длину текущей серии. При достижении k увеличьте индекс дополнительно и обнулите состояние серии; удалённый символ не участвует в следующем подсчёте.
Как удалить символ после серии заданной длины
Храните предыдущий символ и длину текущей серии. При достижении k увеличьте индекс дополнительно и обнулите состояние серии; удалённый символ не участвует в следующем подсчёте.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Идите по исходной строке слева направо. После каждых k одинаковых подряд символов сохраните эти k символов, пропустите один следующий символ, если он есть, и сбросьте счётчик. k — положительное целое. Например, 'aaabcccd' при k=3 превращается в 'aaaccc'.
Ответ
Храните предыдущий символ и длину текущей серии. При достижении k увеличьте индекс дополнительно и обнулите состояние серии; удалённый символ не участвует в следующем подсчёте.
Решение для Unicode code points:
function removeAfterRun(text, k) {
if (!Number.isInteger(k) || k < 1) throw new Error('Invalid k');
const chars = [...text], out = [];
let previous, count = 0;
for (let i = 0; i < chars.length; i++) {
const ch = chars[i];
count = ch === previous ? count + 1 : 1;
previous = ch;
out.push(ch);
if (count === k) { i++; count = 0; previous = undefined; }
}
return out.join('');
}
Время и память O(n). Составные графемы требуют отдельной сегментации.