Сравнивайте символ с его lower/upper-вариантами и ставьте разделитель на границе регистра. Это позволяет обойтись без regex и списка кодов символов.
Напишите функцию преобразования строки из camelCase в snake_case. Нельзя использовать регулярные выражения, коды символов или жёстко заданный список символов; решение должно работать универсально. Оцените временную и пространственную сложность.
Сравнивайте символ с его lower/upper-вариантами и ставьте разделитель на границе регистра. Это позволяет обойтись без regex и списка кодов символов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Сравнивайте символ с его lower/upper-вариантами и ставьте разделитель на границе регистра. Это позволяет обойтись без regex и списка кодов символов.
Правило ниже сохраняет аббревиатуры: HTTPServer → http_server; для Unicode используются преобразования регистра JavaScript, а не языковое выделение слов.
function snakeCase(text) {
const chars = Array.from(text);
const upper = ch => ch !== undefined && ch !== ch.toLowerCase() && ch === ch.toUpperCase();
const lower = ch => ch !== undefined && ch !== ch.toUpperCase() && ch === ch.toLowerCase();
const result = [];
for (let i = 0; i < chars.length; i++) {
const ch = chars[i];
if (i > 0 && upper(ch) && (!upper(chars[i - 1]) || lower(chars[i + 1]))) {
result.push('_');
}
result.push(ch.toLowerCase());
}
return result.join('');
}
Время и память O(n) по длине строки. Для уже имеющихся разделителей и языково-зависимого регистра нужен согласованный дополнительный контракт; универсальное определение границ слов из регистра невозможно.