Напишите функцию преобразования строки из camelCase в snake_case. Нельзя использовать регулярные выражения, коды символов или жёстко заданный список символов; решение должно работать универсально. Оцените временную и пространственную сложность.

Сравнивайте символ с его lower/upper-вариантами и ставьте разделитель на границе регистра. Это позволяет обойтись без regex и списка кодов символов.

Короткий ответ

Что ответить на собеседовании

Сравнивайте символ с его 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) по длине строки. Для уже имеющихся разделителей и языково-зависимого регистра нужен согласованный дополнительный контракт; универсальное определение границ слов из регистра невозможно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее