JavaScriptJavaScript Interview

Рішення задачі Reversed String на технічному інтервʼю з JavaScript

Привіт! Сьогодні ми розглянемо одну з найпопулярніших задач на технічних співбесідах — розворот рядка (Reversed String). Це класична задача, яка перевіряє ваше розуміння роботи з рядками, масивами та базовими алгоритмами в JavaScript.

Формулювання задачі

Потрібно написати функцію, яка приймає рядок і повертає його в зворотному порядку. Наприклад:

  • Вхід: “hello” → Вихід: “olleh”
  • Вхід: “JavaScript” → Вихід: “tpircSavaJ”

Здається просто, правда? Але інтервʼюери хочуть побачити не лише рішення, а й ваш спосіб мислення, знання різних підходів та розуміння їхніх переваг і недоліків.

Спосіб 1: Вбудовані методи (найпростіший)

Найочевидніший підхід — використати вбудовані методи JavaScript:

function reverseString(str) {
  return str.split('').reverse().join('');
}

Як це працює:

  • split('') розбиває рядок на масив окремих символів
  • reverse() перевертає масив
  • join('') зʼєднує символи назад у рядок

Плюси: чистий, читабельний код, одна строка Мінуси: створює додаткові структури даних, може бути не найефективнішим для дуже великих рядків

Спосіб 2: Цикл for (класичний підхід)

function reverseString(str) {
  let reversed = '';
  for (let i = str.length - 1; i >= 0; i--) {
    reversed += str[i];
  }
  return reversed;
}

Тут ми йдемо від кінця рядка до початку і додаємо кожен символ до нового рядка. Це демонструє розуміння базових циклів та індексації.

Спосіб 3: Рекурсія (для просунутих)

function reverseString(str) {
  if (str === '') return '';
  return reverseString(str.substr(1)) + str[0];
}

Рекурсивний підхід показує ваше розуміння складніших концепцій. Функція викликає саму себе з рядком без першого символу, а потім додає цей символ у кінець.

Увага: для довгих рядків може виникнути переповнення стека викликів!

Спосіб 4: Метод reduce (функціональне програмування)

function reverseString(str) {
  return str.split('').reduce((reversed, char) => char + reversed, '');
}

Цей підхід демонструє знання функціонального програмування. Ми “зменшуємо” масив символів, додаючи кожен символ на початок акумулятора.

Спосіб 5: Двома вказівниками (оптимальний для масивів)

function reverseString(str) {
  const arr = str.split('');
  let left = 0;
  let right = arr.length - 1;
  
  while (left < right) {
    [arr[left], arr[right]] = [arr[right], arr[left]];
    left++;
    right--;
  }
  
  return arr.join('');
}

Техніка двох вказівників часто використовується в алгоритмах. Ми міняємо місцями символи з обох кінців, рухаючись до центру.

Що очікують на інтервʼю?

Інтервʼюер хоче побачити:

  1. Комунікацію — проговорюйте свій хід думок вголос
  2. Різні підходи — покажіть, що знаєте декілька способів
  3. Аналіз складності — обговоріть часову та просторову складність (зазвичай O(n) для часу)
  4. Крайові випадки — що буде з порожнім рядком? З одним символом?
  5. Чистий код — використовуйте зрозумілі назви змінних

Поширені помилки

  • Забути перевірити порожній рядок
  • Неправильно працювати з індексами (off-by-one errors)
  • Модифікувати вихідний рядок (рядки в JS незмінні!)
  • Не враховувати Unicode символи (емоджі, складні символи)

Додаткові питання, які можуть поставити

  • Як би ви розвернули лише слова в реченні, але не самі літери?
  • Як обробити Unicode символи правильно?
  • Чи можна зробити це без додаткової памʼяті?
  • Як би змінилося рішення для дуже великого рядка (мільйони символів)?

Висновок

Задача на розворот рядка — це відмінна можливість продемонструвати:

  • Знання базового синтаксису JavaScript
  • Розуміння різних підходів до вирішення проблеми
  • Вміння аналізувати складність алгоритмів
  • Навички чистого коду

Наступного разу на інтервʼю не просто дайте перше рішення, що спадає на думку. Обговоріть альтернативи, їхні плюси та мінуси, і продемонструйте глибину свого розуміння!

Підписуйтесь на канал, щоб не пропустити інші задачі з технічних інтервʼю. Удачі на співбесідах! 🚀