Привіт! Сьогодні ми розглянемо одну з найпопулярніших задач на технічних співбесідах — розворот рядка (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('');
}
Техніка двох вказівників часто використовується в алгоритмах. Ми міняємо місцями символи з обох кінців, рухаючись до центру.
Що очікують на інтервʼю?
Інтервʼюер хоче побачити:
- Комунікацію — проговорюйте свій хід думок вголос
- Різні підходи — покажіть, що знаєте декілька способів
- Аналіз складності — обговоріть часову та просторову складність (зазвичай O(n) для часу)
- Крайові випадки — що буде з порожнім рядком? З одним символом?
- Чистий код — використовуйте зрозумілі назви змінних
Поширені помилки
- Забути перевірити порожній рядок
- Неправильно працювати з індексами (off-by-one errors)
- Модифікувати вихідний рядок (рядки в JS незмінні!)
- Не враховувати Unicode символи (емоджі, складні символи)
Додаткові питання, які можуть поставити
- Як би ви розвернули лише слова в реченні, але не самі літери?
- Як обробити Unicode символи правильно?
- Чи можна зробити це без додаткової памʼяті?
- Як би змінилося рішення для дуже великого рядка (мільйони символів)?
Висновок
Задача на розворот рядка — це відмінна можливість продемонструвати:
- Знання базового синтаксису JavaScript
- Розуміння різних підходів до вирішення проблеми
- Вміння аналізувати складність алгоритмів
- Навички чистого коду
Наступного разу на інтервʼю не просто дайте перше рішення, що спадає на думку. Обговоріть альтернативи, їхні плюси та мінуси, і продемонструйте глибину свого розуміння!
Підписуйтесь на канал, щоб не пропустити інші задачі з технічних інтервʼю. Удачі на співбесідах! 🚀