Проверьте, является ли строка палиндром

Я понял это из статьи о проблемах с интервью /кодами. Текст запроса выглядит следующим образом:

  

Палиндром - это слово, фраза, число или другая последовательность   символы, которые читаются одинаково назад или вперед. Пособие может быть   для корректировки заглавных букв, знаков препинания и слова   разделители. Примеры на английском языке включают «Человек, план, канал,   Панама! »,« Амор »,« Рома »,« гоночный автомобиль »,« стоп-кошки »,« шаг на отсутствие домашних животных »,   «Taco cat», «подставил», «Это был автомобиль или кошка, которую я видел?» И «No 'x' in   Никсон».

     

Напишите наиболее эффективную функцию, которую вы можете определить,   данная строка является палиндром.

     

Ваша функция должна принимать строку как параметр и возвращать   boolean (true, если строка является палиндром, false, если это не так).

     

Предположим, что этот код будет помещен в реальную производственную систему и   напишите соответствующим образом.

Статья в вопросе: https: //blog.devmastery. ком /как к победе, заместитель кодирования-интервью-71ae7102d685

Моя реализация:

Несмотря на то, что статья предоставляет способ ее решения, моя реализация отличается несколькими способами, поэтому я хотел бы, чтобы вы рассуждали об этом.

/*
 * Reverses a given string of characters
 *
 * @param {string} string - the string to reverse
 * @returns {string} - the reversed string
 *
 */
const reverseString = string => string.split('').reverse().join('');

/*
 * Function to test if a given string is a palindrome
 *
 * @param {string} string - the string to test
 * @returns {boolean | string} - returns true/false based on the string, being a palindrome, 
 *                               or string if there is an error
 *
 */
const isPalindrome = string => {
    if (string) {
      let regexReplacer = /\.|\,| |\!|\?|\'|\"|\/|\\|\-|\_|\+|\‘|\’/g;
      let cleanString = string.replace(regexReplacer, '');
      return (cleanString.toLowerCase() === reverseString(cleanString).toLowerCase());
    }
    return '[isPalindrome]: string not supplied, exiting!';
};

/*
 * Basic function to test equality, poor-man's unit test
 *
 * @param {string} test - the string to test
 * @param {string | boolean} reponse - the expected result
 * @param {function} [func = isPalindrome] - the function to test, defaults to isPalindrome
 *
 */
const expectToEqual = (test, reponse, func = isPalindrome) => {
    if (func(test) === reponse) { console.info('Test for "' + test + '" passed!'); }
    else { console.error('Test for "' + test + '" failed!'); }
};

expectToEqual('A man, a plan, a canal, Panama!', true);

expectToEqual('raceca', false);

expectToEqual('No \‘x\’ in Nixon', true);

expectToEqual('', '[isPalindrome]: string not supplied, exiting!');

Ссылка на jsbin: https://jsbin.com/hilatev/edit?js,console

Вопросы:

  1. Regex . Я использую /\.|\,| |\!|\?|\'|\"|\/|\\|\-|\_|\+|\‘|\’/g для замены несловных символов в сравнении с этим /[^a-z0–9]/ig, что является очевидным. Но вам все равно понравится ваш вход.
  2. Строковое тестирование . Реализация, представленная в статье, проходит через строку в цикле while и проверяет каждый символ. Является ли это благоприятным против того, как я просто сравнивал строки? Почему?
  3. Возвращает . Функция палиндрома возвращает true /false на основе строки, но также возвращает строку, если нет строки. Является ли это благоприятным или я должен просто выбросить ошибку?
  4. Кромки с краями . Оглядываясь назад, мне не хватает и очевидного большого случая, после замены регулярного выражения, что, если вы закончите с пустой строкой? Кроме того, я пропустил еще что-нибудь важное? Или незначительный?
  5. Тесты . Я написал свою собственную небольшую тестовую функцию и в статье она просто распечатывает ожидаемый результат (Пример: console.log(isPalindrome("racecar") + " = true");). Это выгодно? Почему?
  6. Другое . Что я, возможно, пропустил?
8 голосов | спросил 481b8423202598ecfb233c5fa68caf 1 J000000Friday16 2016, 15:47:42

3 ответа


5

Хороший вопрос,

  1. , как упоминает Джозеф, белый список обычно является лучшим подходом, и в этом случае это также более читаемый подход.

  2. Мне нравится ваш подход лучше, он избегает перезаписывать колесо

  3. Когда кто-то передает 4 в качестве параметра, что произойдет? Я бы выбрал исключение, если вызывающий не передает String. Я бы, вероятно, передал false, если "" при условии,.

  4. См. пункт 3.

  5. Я не большой поклонник TDD, но я - outlier;) Тем не менее, тест Nixon заставил меня посмеяться

  6. Вам нужно только преобразовать в нижний регистр один раз:

    let cleanString = string.replace(regexReplacer, '').toLowerCase();
    return cleanString === reverseString(cleanString);
    

    Я также удалил скобки вокруг возвращаемого значения, мой разум имеет тенденцию застревать на секунду или два, задаваясь вопросом, не пропал ли я что-то или автор просто параноик;)

ответил konijn 1 J000000Friday16 2016, 21:59:56
3
  1. Сначала вытащите Regex из функции. Другое дело - изменить его на /\W|\_/g, потому что если вы пропустили один из символов в длинном списке символов, отличных от слова.

  2. Вы тратите много времени. Вы повторяете один раз, чтобы удалить все символы, отличные от слов, затем один раз, чтобы разделить, затем другой, чтобы перевернуть, затем еще один, чтобы присоединиться, затем еще два для каждого строчного регистра, а затем прокрутите, чтобы проверить, совпадают ли они ...


string = string.replace(regexReplacer,'');
for(var i = 0, j = string.length; i < j;)
    if(string[i++].toLowerCase() !== string[--j].toLowerCase()) return false;
return true;

  1. Выбросьте ошибку, потому что полная строка по-прежнему оценивается как true в JavaScript . Но, по-моему, не замедляйте свой код для учета неправильного использования. Таким образом, люди, которые знают, что делают, не замедлятся, чтобы проверить, является ли это строкой. Таким образом, если кто-то обернет вашу библиотеку, они могут сделать чек, если они захотят:)

  2. Если он пуст, на мой взгляд это палиндром. Кроме этого, я не вижу больших.

  3. Да, это обычно называется утверждением. Когда вы делаете небольшие тесты, как вы делаете, это прекрасно, чтобы создать небольшой. Я предпочитаю модульность при создании программного обеспечения. (Как я уже сказал в комментариях) Если все, что я хочу, это перо, не дай мне всю птицу. Так много библиотек для JavaScript . Даже сакральный jQuery делает это, когда все, что я хочу, - это отправить запрос AJAX , я должен принести эту огромную библиотеку. Для меня это медленный и громоздкий, поэтому, когда я делаю программное обеспечение, я делаю небольшой кусок, чтобы справиться с одной задачей и оптимизировать ее, чтобы сделать это. Но если вы ищете общую библиотеку, используемую для обработки модульного тестирования на уровне отрасли QUnit делает очень хорошую работу, но просто приносит всю птицу.

  4. Код, который я предоставил, должен помочь ...

ответил tkellehe 9 J000000Saturday16 2016, 14:49:04
0

Этот вопрос устарел, но ...

а. Для эффективности вы можете просто вызвать toLowercase() один раз.

В. Один из основных вопросов заключается в том, является ли пустая строка - или строка без букв - палиндром или нет. Если вы говорите «да», вам не нужно вводить код для этого, и вы получите правильный ответ:

  1. нормализовать строку, удалив все буквы без буквы и в нижнем регистре.
  2. отменить его
  3. return true или false на основе эквивалентности

С. Ваша точка C, «также возвращает строку, если нет строки, поставленной», на самом деле не очень точная. Если вы передадите ему пустую строку, вы получите строку с ошибкой. Вероятно, это ошибка. Но чтобы ответить на ваш вопрос, для логической функции, вероятно, гораздо лучше просто выбросить исключение. В этом случае вы можете просто извлечь весь этот код. Обратный код взорвется, и вы получите исключение.

ответил ndp 13 AM00000040000004931 2018, 04:49:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132