Solve problems from JS interviews | Palindrome

แชร์
ฝัง
  • เผยแพร่เมื่อ 16 พ.ย. 2024

ความคิดเห็น • 85

  • @frontendscience
    @frontendscience  5 ปีที่แล้ว +4

    Друзья, пишите свои решения в комментариях! Чем больше будет таких решений и чем они будут разнообразнее, тем больше пользы они принесут всем, тем успешнее будут наши собеседования!

  • @alexnikolskiy
    @alexnikolskiy 5 ปีที่แล้ว +13

    Можно переписать второе решение через два указателя:
    function palindrome(str = '') {
    let left = 0;
    let right = str ? str.length - 1 : 0;
    while (left < right) {
    if (str[left] !== str[right]) {
    return false;
    }
    left++;
    right--;
    }
    return true;
    }
    А ещё можно было бы упомянуть про сложность алгоритмов, про big-O. Да в целом эти алгоритмы имеют вычислительную сложность O(n), но если уточнить, то в первом примере, если опустить преобразование к нижнему регистру и удаление пробелов, мы имеем лишние обходы строки/массива и лишнюю память. Снача split разбивает строку в массив, и при этом выделяется дополнительная память под этот массив. Reverse обходит массив, но за n/2 операций, так как меняет элементы местами через два указателя, и мутирует, по-этому память не изменяется. И join также проходится по всему массиву, собирает всё в строку и выделят под неё дополнительную память. Итого по сути у нас O(n + n/2 + n) и лишний массив со строкой в памяти. А второй вариант не расходует дополнительную память и имеет сложность O(n/2)

    • @frontendscience
      @frontendscience  5 ปีที่แล้ว +3

      Тоже отличное решение с указателями! Да решение через один цикл - работает быстрее и с меньшим количеством памяти. Решение через методы строки и массивов - удобочитаемое. Какое выбрать - вопрос каждой конкретной ситуации. На собеседовании можно рассказать про оба и объяснить сильные/слабые стороны каждого из них. ЗЫ: про сложность алгоритма на собеседовании тоже можно рассказать - добавить дополнительных очков.

    • @smashno
      @smashno 5 ปีที่แล้ว +2

      Ага, так тоже сгодится, Саш. Интересно, какие еще решения найдут наши подписчики!)

    • @1kvolt1978
      @1kvolt1978 3 ปีที่แล้ว

      Кроме того второй вариант (или твой с указателями) значительно проще портируется на другие языки, поскольку использует только базовые конструкции, которые есть практически в любом языке, а не встроенные методы JS, которых во многих языках нет и которые придётся писать дополнительно.
      Но для полноты картины всё же надо добавить проверку на символы пробела, табуляции, переноса строки и знаки препинания, чтобы проверять сложные палиндромы.

    • @Fs-xj2gu
      @Fs-xj2gu ปีที่แล้ว

      так 2 решение тоже через указатели работают

  • @vladislavbogdashev1803
    @vladislavbogdashev1803 5 ปีที่แล้ว +11

    На собеседованиях ещё гуляет такая задача: определить, являются ли строки анаграммами (когда две строки содержат одинаковый набор символов (учитываются только буквы!)).
    Вот моё решение:
    Сначала обе строки разбиваем на массивы, сортируем их, а затем отсортированные последовательности снова собираем в строки. Если обе строки оказались одинаковыми (а они окажутся одинаковыми, если набор символов был один и тот же в обеих строках), то можно сделать вывод, что строки являются анаграммами.
    Вот мой код:
    function sortString(str){
    //переводим все буквы в нижний регистр
    str = str.toLowerCase();
    //превращаем строку в массив
    let arr = str.split('');
    //создаём регулярное выражение, которое пропускает только символы
    let rgxp = new RegExp(/^[a-zа-яё]/);
    //удаляем из массива все элеметны, которые не являются символами (буквами)
    for(let i = 0; i < arr.length; i++){
    if(!rgxp.test(arr[i])){
    delete arr[i];
    }
    }
    //создаём массив, в котором будет храниться его отсортированная копия
    let res = [];
    //сортируем массив
    for(let i = 0; i < arr.length; i++){
    for(let j = 0; j < arr.length; j++){
    if(arr[i] < arr[j]) {
    let v = arr[i];
    arr[i] = arr[j];
    arr[j] = v;
    }
    }
    }
    //возвращаем результат уже в виде строки
    return arr.join('');
    }
    //создаём две строки, наполненные одинаковыми символами
    let str1 = 'Hello wrldo!';
    let str2 = 'Ole!hl drlow';
    //
    let strA = sortString(str1);
    let strB = sortString(str2);
    //выводим строки в консоль
    console.log(strA);
    console.log(strB);
    //сравниваем полученные строки
    console.log(strA == strB);

    • @smashno
      @smashno 5 ปีที่แล้ว +4

      Хороший алгоритм! (И калассно что с комментариями/разъяснениями) Мы как раз уже сняли видео про эту задачу. Там есть еще варианты ее решения. Посмотрите: th-cam.com/video/YlxIvmrijmY/w-d-xo.html

    • @АнастасияДанилюк-я7л
      @АнастасияДанилюк-я7л 4 ปีที่แล้ว +4

      function anagrams(a, b) {
      return b.filter(w=>''+[...a].sort()===''+[...w].sort());
      }

    • @yaroslavoz
      @yaroslavoz 3 ปีที่แล้ว +1

      @@АнастасияДанилюк-я7л правая часть в условии функции фильтра разве не будет одну букву выводить? я бы скорее использовал includes.

  • @SerzhNesteruk
    @SerzhNesteruk ปีที่แล้ว +1

    Среди палиндромов есть, например, такой:
    const input = '«Ура!», - вопите, дети, повару!';
    Чтобы и на него функция возвращала true, предлагаю следующий вариант решения:
    const palindrome = str => {
    let directOrder = '';
    let reverseOrder = '';
    for (const char of str.toLowerCase()) {
    if (char !== char.toUpperCase()) {
    directOrder += char;
    reverseOrder = char + reverseOrder;
    }
    }
    return directOrder.length > 0
    && directOrder === reverseOrder;
    };

  • @sv2109
    @sv2109 3 ปีที่แล้ว +7

    Спасибо за видео.
    Вместо str.split('') можно еще сделать [...str]
    А насчет задачек - огромное их к-во есть на codewars любого уровня сложности и на любой вкус от очень простых типа полиндрома до разных криптографичеких методов, реально классная штука, только затягивает сильно))

  • @multiply87
    @multiply87 3 ปีที่แล้ว +1

    Спасибо, изначально думал о втором варианте, а первый всё-таки красивее) Беру в копилку эту задачку)

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว +1

      Рад, что было полезно

  • @sktlmarat
    @sktlmarat 3 ปีที่แล้ว +3

    function isPalindrome(str){
    if(str.length === 1) return true;
    if(str.length === 2) return str[0] === str[1];
    if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1))
    return false;
    }

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      Класс! Благодарю за решение. Рекурсивного варианта еще не было )

  • @dmytrokrsh3780
    @dmytrokrsh3780 5 ปีที่แล้ว +4

    За именования переменных не судите строго, у меня с этим проблемы
    function palindrome(str = '') {
    const strLowerCase = str.toLowerCase();
    const strNoSpaces = strLowerCase.split(' ').join('');
    const strNoSpacesReverse = strNoSpaces.split('').reverse().join('');
    return strNoSpaces === strNoSpacesReverse;
    }

  • @asdasd-hg3uz
    @asdasd-hg3uz 9 หลายเดือนก่อน

    скажите а почему при сравнении елементов в цикле(первого и последнего) мы не убираем пробелы методом replace.Если сравнивать второй елемент и предпоследний то мы сравниваем пробел и букву.Поидеи должно выбить false.Но к моему удивлению выбило true на длинной фразе

  • @frozeninside5004
    @frozeninside5004 3 ปีที่แล้ว +1

    Спасибо! Пригодится

  • @etherium-gold
    @etherium-gold ปีที่แล้ว

    спасибо

  • @ИванНазаров-н4у
    @ИванНазаров-н4у 4 ปีที่แล้ว +2

    какой ты красава

  • @aripenko
    @aripenko 4 ปีที่แล้ว +4

    Вместо \S я бы использовал \W, дабы исключить запятые и прочее.

    • @frontendscience
      @frontendscience  4 ปีที่แล้ว

      Да, хорошее предложение!

  • @rstark
    @rstark 2 ปีที่แล้ว

    Спасибо большое, я как раз готовлюсь, нравится ваша подача информации, приятно слушать! ещё рекурсией решают такую задачу, можно ли увидеть ваш вариант с рекурсией? Хотя бы в комментариях здесь, видео делать трудозатратное дело.. понимаю. Буду очень благодарен за подсказку в комментариях 😊

    • @frontendscience
      @frontendscience  2 ปีที่แล้ว +2

      Вот вариант с рекурсией:
      function isPal(str) {
      if (str.length < 2) {
      return true;
      } else {
      if (str[0] === str[str.length-1]) {
      return isPal(str.substring(1,str.length-1));
      } else {
      return false;
      }
      }
      }
      На каждой итерации проверяем самые крайние символы - если они одинаковы - откусываем их и оставшуюся строку опять скармливаем этой функции. Если символов останется 1 или 0 - то значит был палиндром.

  • @oleksiipetrenko3824
    @oleksiipetrenko3824 4 ปีที่แล้ว +10

    А как на счет нахождения подстроки в строке, которая является палиндромом? :)
    Например 4512332167 не палиндром, но его часть 123321 - палиндром.

    • @frontendscience
      @frontendscience  4 ปีที่แล้ว +6

      Классная задача! Добавили в список на съемку.

  • @Ramosok
    @Ramosok 8 หลายเดือนก่อน

  • @SweettyDavid
    @SweettyDavid 3 ปีที่แล้ว

    well done!

  • @yarik83men51
    @yarik83men51 3 ปีที่แล้ว

    Позволю себе пофлудить. Сорян если задел чьи то чувства,
    Решение короткое на Java:
    public class Palindrom_sentence {
    public static void main(String[] args) {
    String str1 = "А роза упала на лапу Азора";
    String str2 = "aboba1";
    System.out.println(isPalindrom(str1));
    }
    private static boolean isPalindrom(String str) {
    return str.equals(new StringBuilder(str.toLowerCase().replaceAll("\\s", "")).reverse().toString());
    } }

  • @lukts7839
    @lukts7839 2 ปีที่แล้ว

    День добрый! Спасибо большое за урок. У меня вопрос, а второй вариант разве решает проблему с пробелами? Чеивертая строка выдаст true?

    • @frontendscience
      @frontendscience  2 ปีที่แล้ว

      Подготовку строки я уже не стал включать во второй пример. Можете скопировать эту строчку из первого примера, если необходимо.

  • @oduvanio
    @oduvanio 3 ปีที่แล้ว +1

    Во втором примере решения "Анна" и "А роза упала на лапу Азора" вернёт false

  • @wisarty
    @wisarty 2 ปีที่แล้ว

    Дякую

  • @variagc1232
    @variagc1232 4 ปีที่แล้ว +2

    А я вот на этой задаче завис..
    Напишите функцию isPrime(n) для проверки, простое число n или нет.
    * Напомним, что число называют простым, если оно больше 1 и делится
    * без остатка только на 1 и на само себя.
    *
    * На вход функция должна принимать число n и возвращать true,
    * если n простое, и false - если нет.

    • @frontendscience
      @frontendscience  4 ปีที่แล้ว +2

      Отличная задача, спасибо за идею! Запишем!

    • @variagc1232
      @variagc1232 4 ปีที่แล้ว +1

      @@frontendscience по ходу, могу потихоньку покидывать ещё по возврастанию 😉

    • @frontendscience
      @frontendscience  4 ปีที่แล้ว +1

      Variag C да, да, супер, присылайте!

    • @variagc1232
      @variagc1232 4 ปีที่แล้ว +1

      @@frontendscience
      Когда будете выводить в консоль, сделайте проверку на цифру 2.

    • @variagc1232
      @variagc1232 4 ปีที่แล้ว +2

      @@frontendscience Вот такая, например «Сумма двух»
      *
      * Напишите функцию sumOfTwo(arr, num). Её аргументы: массив целых чисел arr
      * и целое число num. Функция должна вернуть true, если в переданном массиве
      * есть какие-то два числа, чья сумма равна num. Если же такой пары чисел нет,
      * функция должна вернуть false.
      *
      */
      function sumOfTwo(arr, sum) {
      // Напишите код здесь
      }
      // Протестируйте решение, вызывая функцию с разными аргументами:
      console.log(sumOfTwo([1, 2, 3, 4, 5], 4)); // true (так как 1 + 3 === 4)
      console.log(sumOfTwo([1, 2, 3, 4, 5], 100)); // false

  • @gambelz
    @gambelz 5 ปีที่แล้ว +3

    Е эл ба тэ , ага))

    • @smashno
      @smashno 5 ปีที่แล้ว +1

      f4.bcbits.com/img/a1711455071_5.jpg

  • @alexkardone3809
    @alexkardone3809 3 ปีที่แล้ว

    Мои решения (про регулярку я забыл):
    function palindrome(string) {
    const str = string.split('').filter((el) => el !== ' ').join().toLowerCase();
    return str === str.split('').reverse().join('');
    }
    function palindrome(string) {
    const str = string
    .split('').filter((el) => el !== ' ').join().toLowerCase();
    const arr = str.split('');
    let len = arr.length - 1;
    for (let i = 0; i < str.length; i += 1) {
    if (str[i] !== str[len - i]) return false;
    }
    return true;
    }

  • @АнтонСтрока
    @АнтонСтрока 3 ปีที่แล้ว +1

    Так как я РегЕх не знаю, сделал все так же только вместо replace профилтровал массив на на пробелы split(' ').filter(char => char !== '').reverse().join(' ');

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      да, мне на собеседованиях такой вариант часто писали

  • @Керапут.нет
    @Керапут.нет 3 ปีที่แล้ว

    👌🙈🤗👌🙃

  • @almazmusic
    @almazmusic 5 ปีที่แล้ว +6

    Это, конечно, полезная рубрика будет, но кроме рекурсии особо ничего не пригождалось из задач на собесах. Хз, почему собесы так отличаются от реальных проектов.

    • @smashno
      @smashno 5 ปีที่แล้ว +3

      Бывают очень разнообразные собеседования. У каждой компании свой "стиль" собеседований. Я проходил много собеседований где был симбиоз синтетических задачек (не привязанных к реальной жизни, но про базовые структуры, алгоритмы) и реальных проектных заданий (считай прям как на реальном проекте компании).

  • @ЮляИванова-у3щ
    @ЮляИванова-у3щ 3 ปีที่แล้ว +1

    Ребят, я новичок в JS, помогите, пожалуйста, решить задачку))) Буду очень благодарна!))) Она вроде бы легкая, но я запуталась)) Никак не пойму как это сделать(((((
    Нужно написать две функции
    *Первая функция number(num) должна принимать число и возвращать квадрат этого числа.
    *Вторая функция запрашивает у пользователя число от 18 до 50.
    И если пользователь ввёл не число, нужно сделать ему одно замечание, а если число, нужно вызвать функцию number передав в неё это самое число. Необходимо вывести результат пользователю либо замечание, либо квадрат числа.

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      Держи
      codepen.io/puzankov/pen/JjWVjNx?editors=0011

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 ปีที่แล้ว

      @@frontendscience Огромное Вам спасибо!)

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 ปีที่แล้ว

      Извините, пожалуйста, что снова беспокою Вас(
      А parseInt() используется для того чтобы принять строку в качестве аргумента и вернуть целое число?

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      @@ЮляИванова-у3щ нет. Prompt - делает диалоговое окно для ввода пользователем данных. Но эта функция всегда возвращает строку. Даже если пользователь ввел число, это будет строка с числом. Стобы его сделать действительно числом используется метод parseInt. Если в строке было число то вернется число, если строка содержала не число (например строку привет) то parseInt вернет NaN (not a number)

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 ปีที่แล้ว

      @@frontendscience я поняла, спасибо большое, что объяснили))

  • @anton-vr5xw
    @anton-vr5xw 3 ปีที่แล้ว +1

    главное не забыть во втором способе тоже указать 'str = str.toLowerCase().replace(/\s/g, '')', чтобы в случае с пробелами и заглавными буквами получать правильный результат ))

  • @firewatermoonsun
    @firewatermoonsun 4 ปีที่แล้ว +1

    Во втором решении, а как быть с пробелами?

    • @frontendscience
      @frontendscience  4 ปีที่แล้ว +1

      Точно также как и в первом - если необходимо игнорировать регистр букв и пробелы то добавляем эту строку в начале функции str = str.toLowerCase().repalce(/\s/g,'');

  • @shavarshharutyunyan7673
    @shavarshharutyunyan7673 3 ปีที่แล้ว

    Почему пишем Math.floor? Только это не понял. Спасибо

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว +1

      s = 'abcba' a.length = 5, Math.floor(a/2) = 2. 2й элемент это "c"так как нумерация начинается с 0

  • @kookaburru
    @kookaburru 5 ปีที่แล้ว +4

    Рекурсивное решение палиндрома приветствуется на собесе.

    • @smashno
      @smashno 5 ปีที่แล้ว +1

      А как его решить через рекурсию? Покажешь решение?

    • @kookaburru
      @kookaburru 5 ปีที่แล้ว +6

      @@smashno в тырнете можно найти много решений, например:
      function isPalindrome(str) {
      if (str.length < 2) return true;
      if (str[0] != str[str.length-1]) return false;
      return isPalindrome(str.substr(1, str.length-2));
      }

  • @eugeneromanenko5960
    @eugeneromanenko5960 3 ปีที่แล้ว

    Интересно, почему редактор кода не заругался на "replce" )

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      Может из вежливости)

    • @eugeneromanenko5960
      @eugeneromanenko5960 3 ปีที่แล้ว

      @@frontendscience намек понял, прошу прощения.

    • @frontendscience
      @frontendscience  3 ปีที่แล้ว

      @@eugeneromanenko5960 ))))

  • @DIMAWARCRAFT3
    @DIMAWARCRAFT3 2 ปีที่แล้ว

    очень устал)

  • @olexz2613
    @olexz2613 5 ปีที่แล้ว

    все ето не то вот попробуй с етой строки сделать палиндром uguutu - ответ: uguutuugu или вот abcded - ответ: abcdedcba - такое сможеш?

  • @yuliasereda5671
    @yuliasereda5671 ปีที่แล้ว

    привітик, до того як знайти ваше відео, я вже порішала з цифрами паліндроми і з строчкою. знайшла в гуглі строчку, яка має в собі тире і коми, тому створила окремий масив без символів - може це зайва робота, напишіть будь ласка якщо так.
    const isStrPalindrome = (string) => {
    const arr = string.split("");
    const pureArr = [];
    arr.map((el) => /[a-zA-Z]/.test(el) && pureArr.push(el.toLowerCase()));
    for (let i = 0; i < arr.length; i++) {
    return pureArr[pureArr.length - i - 1] === pureArr[i];
    }
    };
    console.log(isStrPalindrome("A man, a plan, a canal - Panama"));
    PS: чи можуть задати на лавйкодінгу завдання написати клас чи об"єкт з методами?

    • @frontendscience
      @frontendscience  ปีที่แล้ว +1

      Гарне рішення! Для такого вхідного рядка це вірна підготовка. Її можна трохи простіше зробити без додаткового масива. Можно використати replace, та вказати щоб видалились усі не букви.
      З приводу методів - так можуть задати, це дуже поширенний тип завдань.

    • @yuliasereda5671
      @yuliasereda5671 ปีที่แล้ว

      @@frontendscience дуже дякую)

  • @Керапут.нет
    @Керапут.нет 3 ปีที่แล้ว

    👌🙈🤗👌🙃