Цель: реализовать алгоритм сжатия строки, который эффективно группирует последовательности одинаковых символов.
Есть два популярных подхода к решению этой задачи:
Итеративный подход (цикл for
):
С помощью регулярных выражений:
/(.)\1*/g
отлично подходит: (.)
захватывает любой символ, а \1*
ищет его повторения.replace
с функцией обратного вызова для форматирования результата.const compressString = (str) => {
// Если строка пустая, нет смысла продолжать. Возвращаем пустую строку.
if (!str) {
return '';
}
// `result` будет хранить нашу сжатую строку.
let result = '';
// `count` отслеживает количество повторений текущего символа.
let count = 1;
// Итерируем по строке с помощью цикла for.
for (let i = 0; i < str.length; i++) {
// Заглядываем вперед: сравниваем текущий символ (str[i]) со следующим (str[i + 1]).
// Если они совпадают, значит, последовательность продолжается.
if (str[i] === str[i + 1]) {
// Просто увеличиваем счетчик и переходим к следующей итерации.
count++;
} else {
// Если следующий символ другой или это конец строки,
// значит, последовательность текущего символа прервалась.
// Добавляем к результату сам символ.
// Затем проверяем счетчик: если он больше 1, добавляем и его.
// Если счетчик равен 1, ничего не добавляем, согласно условию.
result += str[i] + (count > 1 ? count : '');
// Сбрасываем счетчик до 1 для следующей последовательности символов.
count = 1;
}
}
// Возвращаем итоговую сжатую строку.
return result;
};
Анализ решения:
Плюсы:
Минусы:
result
и count
.const compressString = (str) => {
// Простая проверка на пустую строку.
if (!str) {
return '';
}
// Используем метод `replace` с регулярным выражением.
// Регулярное выражение /(.)\1*/g находит все последовательности
// одинаковых символов в строке.
// ( . ) - Захватывает любой одиночный символ (кроме новой строки) в группу.
// \1* - Ищет ноль или более повторений того, что было захвачено в первой группе.
// g - Глобальный флаг, чтобы найти все совпадения, а не только первое.
return str.replace(/(.)\1*/g, (match, char) => {
// `replace` вызывает эту callback-функцию для каждого найденного совпадения.
// `match` - это вся найденная последовательность (например, "AAAA").
// `char` - это символ, захваченный первой группой (например, "A").
// Если длина найденной последовательности больше 1,
// возвращаем символ + его длину.
// В противном случае (если длина 1), возвращаем только сам символ.
return match.length > 1 ? char + match.length : char;
});
};
Анализ решения:
Плюсы:
Минусы:
Вам нужно создать функцию compressString
, которая выполняет базовое сжатие строки с использованием алгоритма Run-Length Encoding (RLE).
Правила сжатия:
// 'AAA' -> 'A3', 'B' -> 'B', 'CC' -> 'C2'
compressString('AAABCC'); // "A3BC2"
// Нет последовательных повторений
compressString('ABC'); // "ABC"
// Длинная последовательность
compressString('WWWWWWWWWWWW'); // "W12"
// Пустая строка
compressString(''); // ""
compressString
.'a'
и 'A'
— разные символы).Цель: реализовать алгоритм сжатия строки, который эффективно группирует последовательности одинаковых символов.
Есть два популярных подхода к решению этой задачи:
Итеративный подход (цикл for
):
С помощью регулярных выражений:
/(.)\1*/g
отлично подходит: (.)
захватывает любой символ, а \1*
ищет его повторения.replace
с функцией обратного вызова для форматирования результата.const compressString = (str) => {
// Если строка пустая, нет смысла продолжать. Возвращаем пустую строку.
if (!str) {
return '';
}
// `result` будет хранить нашу сжатую строку.
let result = '';
// `count` отслеживает количество повторений текущего символа.
let count = 1;
// Итерируем по строке с помощью цикла for.
for (let i = 0; i < str.length; i++) {
// Заглядываем вперед: сравниваем текущий символ (str[i]) со следующим (str[i + 1]).
// Если они совпадают, значит, последовательность продолжается.
if (str[i] === str[i + 1]) {
// Просто увеличиваем счетчик и переходим к следующей итерации.
count++;
} else {
// Если следующий символ другой или это конец строки,
// значит, последовательность текущего символа прервалась.
// Добавляем к результату сам символ.
// Затем проверяем счетчик: если он больше 1, добавляем и его.
// Если счетчик равен 1, ничего не добавляем, согласно условию.
result += str[i] + (count > 1 ? count : '');
// Сбрасываем счетчик до 1 для следующей последовательности символов.
count = 1;
}
}
// Возвращаем итоговую сжатую строку.
return result;
};
Анализ решения:
Плюсы:
Минусы:
result
и count
.const compressString = (str) => {
// Простая проверка на пустую строку.
if (!str) {
return '';
}
// Используем метод `replace` с регулярным выражением.
// Регулярное выражение /(.)\1*/g находит все последовательности
// одинаковых символов в строке.
// ( . ) - Захватывает любой одиночный символ (кроме новой строки) в группу.
// \1* - Ищет ноль или более повторений того, что было захвачено в первой группе.
// g - Глобальный флаг, чтобы найти все совпадения, а не только первое.
return str.replace(/(.)\1*/g, (match, char) => {
// `replace` вызывает эту callback-функцию для каждого найденного совпадения.
// `match` - это вся найденная последовательность (например, "AAAA").
// `char` - это символ, захваченный первой группой (например, "A").
// Если длина найденной последовательности больше 1,
// возвращаем символ + его длину.
// В противном случае (если длина 1), возвращаем только сам символ.
return match.length > 1 ? char + match.length : char;
});
};
Анализ решения:
Плюсы:
Минусы:
Вам нужно создать функцию compressString
, которая выполняет базовое сжатие строки с использованием алгоритма Run-Length Encoding (RLE).
Правила сжатия:
// 'AAA' -> 'A3', 'B' -> 'B', 'CC' -> 'C2'
compressString('AAABCC'); // "A3BC2"
// Нет последовательных повторений
compressString('ABC'); // "ABC"
// Длинная последовательность
compressString('WWWWWWWWWWWW'); // "W12"
// Пустая строка
compressString(''); // ""
compressString
.'a'
и 'A'
— разные символы).Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!