@LastGeneral

Почему функция не работает?

Задание
Создай функцию isWerewolf, которая принимает строку target и возвращает true, если это оборотень, или false, если это не так. Оборотень — это слово или предложение, которое читается в обоих направлениях одинаково, при этом игнорируя регистр, пробелы и знаки препинания.
В результате должно получится:
isWerewolf('rotator') === true // rotator --> rotator
isWerewolf('home') === false // home --> emoh
isWerewolf('Racecar') === true // регистр игнорируется
isWerewolf('eva, can i see bees in a cave') === true // пробелы и знаки препинания игнорируются

Код
function isWerewolf(target) {
  let direct = target;
  let reversed = target.split('').reverse().join('');
  for (const letter of target) {
    if ( letter.toLowerCase() !== letter.toUpperCase() ) {
      direct = letter + direct;
      reversed = letter + reversed;
    }
  }
  return direct.toLowerCase() === reversed.toLowerCase();
}

Проблема в символах, но не знаю как это решить.
  • Вопрос задан
  • 1821 просмотр
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Ну во-первых, чего Вы хотели добиться вот этим кодом?
for (const letter of target) {
  if ( letter.toLowerCase() !== letter.toUpperCase() ) {
    direct = letter + direct;
    reversed = letter + reversed;
  }
}


Во-вторых, данная задача легко решается за O(n/2), а у Вас как минимум тут O(n):target.split('').reverse().join('')

Нормальный алгоритм для этой задачи такой:
1. Заводим 2 переменные под индексы символов, одна будет смотреть на начало строки (изначальный индекс 0), другая на конец строки (изначальный индекс target.length - 1).
2. Идем циклом по строке с обоих сторон, увеличивая первый индекс и уменьшая второй на каждой итерации.
2.1. Если символ под индексом не подходящий (пробел, знак препинания и т.д.), то его надо пропустить, сместив соответствующий индекс еще на 1 вне очереди. Подсказка: если нужна только латиница, то ее коды символов лежат в диапазонах 65-90 и 97-122 (у строки есть метод charCodeAt), для кириллицы диапазоны 1072-1103, 1040-1071, 1105, 1025.
2.2. Если текущие символы строки, с учетом приведения их к единому регистру не равны, то можно дальше не проверять и сразу возвращать false.
2.3. Если индексы стали равны или пересекли друг друга (индекс с конца меньше индекса с начала), то можно однозначно возвращать true.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kaktusj
function isWerewolf(target) {
let direct = '';
let reversed = '';
for ( const ch of target) {
if ( ch.toLowerCase() !== ch.toUpperCase()) {
direct += ch;
reversed = ch + reversed;
}
}

return direct.toLowerCase() === reversed.toLowerCase();

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы