Numeric palindrome | Solve the LeetCode problem in JavaScript

Поделиться
HTML-код
  • Опубликовано: 24 окт 2024

Комментарии • 78

  • @frontendscience
    @frontendscience  3 года назад +6

    Присылайте свои решения в комментариях!
    Таймкоды:
    00:00 Вступление.
    00:15 Уровень сложности задачи на Leetcode.
    00:31 Условия задачи.
    02:05 Разбор решения.
    08:53 Запуск кода.
    10:10 Сложность получившегося алгоритма по времени и по памяти.
    10:46 Что запланировано на следующий выпуск.

  • @multiply87
    @multiply87 3 года назад +3

    Спасибо. Прям очень интересно алгоритмы узнавать!

  • @Front-Dan
    @Front-Dan Год назад +2

    Нужна еще одна проверка : при x = 0 остаток от деления тоже будет 0, функция вернет false

  • @EvilYou
    @EvilYou 3 года назад +1

    Задача интересная, особенно мне понравилось решение из видео.
    function isPalindrome(x) {
    if (x < 0) return false;
    if (x < 10) return true; // Сначала должна идти эта строка, чтобы при x === 0 сработал return true
    if (x % 10 === 0) return false;
    let reverse = 0;
    while (x > reverse) {
    reverse *= 10;
    reverse += x % 10;
    x = Math.trunc(x / 10);
    }
    return x === reverse || x === Math.trunc(reverse / 10);
    }
    Мне интересен расчет сложности алгоритма в данном случае. Когда мы считаем сложность алгоритма для функций, которые принимают строку или массив, то исходим из числа элементов в них.
    В задаче для одного и того же решения если считать n === кол-ву цифр, сложность алгоритма будет O (n), а если принимать n === самому числу, то сложность будет O (lg n).
    Поэтому возник вопрос: для функций, которые принимают на вход числа принято считать n равным самому числу? Или it's up to us и допустимы оба варианта?

    • @frontendscience
      @frontendscience  3 года назад

      тут реально up to us - просто когда пишется сложность то нужна ремарка типа: O(n) - где n - это длина числа (кол-во цифр в числе)

    • @EvilYou
      @EvilYou 3 года назад

      @@frontendscience спасибо, классно, что ограничений нет здесь :)
      Ведь как лучше записывать зависит от того, сколько полезной информации несет в себе тот или иной вариант записи.

    • @EvilYou
      @EvilYou Год назад +1

      Сам додумался только до этого:
      function isPalindromeNumber(n) {
      if (n < 0) return false;
      if (n < 10) return true;
      if (Math.trunc(n / 10) === n % 10) return true; // < 100
      if (Math.trunc(n / 100) === (n % 100) % 10) return true; // < 1000
      }

    • @SerzhNesteruk
      @SerzhNesteruk Год назад +1

      ​@@EvilYou Интересное решение, до тысячи вроде работает... А какой смысл в остатке от деления на 10 с остатка от деления на 100, если можно сразу взять остаток от деления на 10? 🤔

    • @EvilYou
      @EvilYou Год назад +1

      @@SerzhNesteruk вообще да, это лишнее условие

  • @aleksd286
    @aleksd286 3 года назад

    Спасибо! Было интересно

  • @vty4261
    @vty4261 3 года назад +2

    Не смотря видео, такой вариант прокатит?
    const isPalindromeNumber = function (x) {
    return Number(x.toString().split('').reverse().join('')) === x
    };
    кстати неплохо оставлять сслку на саму задачу в оригинале, если не трудно

    • @vty4261
      @vty4261 3 года назад

      аа все, понял в чем загвоздка, нужно сначала видео смотреть))

    • @frontendscience
      @frontendscience  3 года назад

      @@vty4261 ага ;)

    • @frontendscience
      @frontendscience  3 года назад +1

      Хорошая идея - будем прикладывать ссылку.

  • @Mr29061989
    @Mr29061989 2 года назад

    Спасибо, крутой цикл видео, очень полезный. Хотя я работаю фронтом уже 1.5 года, но некоторые задачи сразу моему пониманию не даются)

    • @frontendscience
      @frontendscience  2 года назад

      Все придет с практикой, потом как орешки щелкать будете))

  • @ОлегБордуляк-й1ю
    @ОлегБордуляк-й1ю 3 года назад +1

    Спасибо! Интерестное решение, но разве если число будет 0, то функция не будет возвращать false? Ведь 0%10 === 0. Надо еще поставить проверку на 0 перед проверкой x%10 === 0.

    • @frontendscience
      @frontendscience  3 года назад

      Нет не будет проблемы - у нас же есть на строку выше проверка if (x < 10) return true

    • @ОлегБордуляк-й1ю
      @ОлегБордуляк-й1ю 3 года назад +1

      @@frontendscience эта проверка на строку ниже, и до неё проверка не дойдет, потому что x%10 === 0 вернет false раньше

    • @frontendscience
      @frontendscience  3 года назад +1

      @@ОлегБордуляк-й1ю хммм. В codepen код верный, в видео перепутан порядок строк.

    • @ОлегБордуляк-й1ю
      @ОлегБордуляк-й1ю 3 года назад

      @@frontendscience Классный канал) Интерестные решения) много нового для себя получаю) спасибо)

    • @frontendscience
      @frontendscience  3 года назад

      @@ОлегБордуляк-й1ю Рад слышать! )

  • @ДмитрийБердик-ж4б
    @ДмитрийБердик-ж4б 3 года назад +1

    А есть решение, чтобы сразу и строку, и число определяло на палиндром?

    • @frontendscience
      @frontendscience  3 года назад +1

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

    • @ДмитрийБердик-ж4б
      @ДмитрийБердик-ж4б 3 года назад

      @@frontendscienceСпасибо

  • @t1ltmare
    @t1ltmare 2 года назад

    Эта несложная задачка поможет мне решить задачу
    Кому интересно:
    Reverse Number is a number which is the same when reversed.
    For example, the first 20 Reverse Numbers are:
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101
    TASK:
    You need to return the nth reverse number. (Assume that reverse numbers start from 0 as shown in the example.)
    NOTES:
    1 < n

    • @nanouasyn
      @nanouasyn Год назад

      ничего себе сравнение. приведённая тобой задача значительно сложнее. сейчас часа четыре на неё убил. но таки да, есть решение условно за O(1), если заметить, что в последовательности чисел-палиндромов, если выкинуть число 0, сначала идёт 9 однозначных чисел, потом 9 двузначных, потом 90 трёхзначных, потом 90 четырёхзначных, потом 900 пятизначных, потом 900 шестизначных, и так далее.

  • @11King99
    @11King99 3 года назад

    function isPalindromeNumber(num) {
    if (num

    • @11King99
      @11King99 3 года назад

      function isPalindromeNumber(num) {
      if (num

    • @frontendscience
      @frontendscience  3 года назад +1

      Хорошие варианты как для палиндрома любого типа. но при этом у нас линейная сложность по памяти выходит.

    • @11King99
      @11King99 3 года назад

      @@frontendscience линейная сложность по памяти, это плохо?(извините, ещё не сильно разбираюсь)

    • @frontendscience
      @frontendscience  3 года назад

      Конкретно в этом случае линейная сложность хуже, чем константная.
      Рекомендую посмотреть видео про то, как расчитывать сложность алгоритма: ruclips.net/video/Fu4BzQNN0Qs/видео.html

  • @diamondskrt
    @diamondskrt Год назад

    Вот так вроде работает)
    const isPalindrom = (num) => {
    let rev = 0;
    if (num % 10 === 0 && num !== 0) {
    return false;
    }
    while (rev < num) {
    rev = Number(`${rev}` + (num % 10));
    if (rev < num) {
    num = Math.trunc(num / 10);
    }
    }
    return rev === num;
    };

  • @БаястанНурбек-ж6ж
    @БаястанНурбек-ж6ж 2 года назад +1

    Вот так у меня вышло
    function numPalindrome(n) {
    if (n < 0) return false
    if (n % 10 === 0) return false
    let i = n
    let rev = 0
    while (i > 0) {
    rev *= 10
    rev += i % 10
    i = Math.floor(i/10)
    }
    return rev == n
    }

  • @quite10
    @quite10 3 года назад

    Спасибо за разбор!)
    Подскажите, а когда есть массив к примеру [‘радар’, ‘вор’, ‘доход’, ‘потом’]
    Как в этом случае быть? Как найти среди них палиндромы?
    Может я пропустила какое-то ваше видео((

    • @frontendscience
      @frontendscience  3 года назад +1

      Нужно использовать функцию проверяющую на палиндром и отфильтровать только палиндромы в массиве.
      arr.filter((str) => return isPalindrome(str) )
      Видео где мы разбираем такую функцию вот: ruclips.net/video/eXjUz2Kuuw4/видео.html

    • @quite10
      @quite10 3 года назад

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

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 года назад +1

      Я часто смотрю ваши видео, действительно вы хорошо разбираете задачки, правда мне не всегда понятно так как многое ещё не проходила, но всё равно очень интересно, не находила канал лучше чем ваш😉
      Возник вопрос, в продолжении к этому, а как с помощью цикла новичку можно решить?) Посмотрела все видео про палиндромы, но для меня пока сложновато(

    • @frontendscience
      @frontendscience  3 года назад

      Благодарю рад слышать!
      Все прийдет с практикой.
      Вот решение: codepen.io/puzankov/pen/vYxqzQG?editors=0011

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 года назад

      @@frontendscience теперь понятно, спасибо, что ответили😊

  • @wisarty
    @wisarty 2 года назад

    Дякую

  • @otakusama94
    @otakusama94 3 года назад

    js считает, что 0 % 10 === 0
    следовательно порядок должен быть такой
    if (num < 0) return false;
    if (num < 10) return true;
    if (num % 10 === 0) return false;

    • @frontendscience
      @frontendscience  3 года назад

      Благодарю за уточнение! Действительно, чтобы при 0 правильно сработало, надо поменять порядок! Подправил в codpene!

  • @Hol1net
    @Hol1net 3 года назад

    А можно ведь было вот так ещё сделать?
    const isPalindrom = (x) => x.toString() === x.toString().split('').reverse().join('')

    • @frontendscience
      @frontendscience  3 года назад

      Можно было. Но я в видео говорил что надо решить задачу без конвертации в строку так как есть ограничение по памяти. 1:14 нужно решить задачу за O(1) по памяти

    • @Hol1net
      @Hol1net 3 года назад

      @@frontendscience Ой, тогда извиняюсь, я походу этот момент прослушал

  • @pupizoid100
    @pupizoid100 Год назад

    А почему if ( x < 10 ) равно true. Это же наоборот плохо и false? не

    • @МаксимХлопяник
      @МаксимХлопяник Год назад

      число состоящие из одной цифры принято считать также палиндромом

  • @romanryaboshtan9270
    @romanryaboshtan9270 2 года назад

    Это задача easy level сразу видно

  • @ВероникаСампетова-ц8ж

    вот так вот решила
    function isNumPalindrom (num) {
    if(num < 0 || num % 10 === 0) return false;
    if(num < 10) return true;
    let rev = '';
    let cur = num;
    while (num > rev) {
    rev += cur % 10
    cur = Math.trunc(cur / 10)
    }
    return rev == num;
    }

    • @frontendscience
      @frontendscience  3 года назад +1

      Класс! Благодарю за решение!

  • @ruff3d
    @ruff3d 3 года назад +2

    function pol(n) {
    const s = n.toString();
    return Array.from(s).reverse().join('') === s
    }

    • @frontendscience
      @frontendscience  3 года назад +1

      Благодарю за решение, но в условии как раз сказано что такой вариант не подойдет - надо более оптимальный. Хотя этот универсальный

    • @ruff3d
      @ruff3d 3 года назад

      @@frontendscience в каком плане более оптимальный? Как по мне это О(1).
      А понял, ну если это констрейн то ок

    • @NinjaNoobful
      @NinjaNoobful 3 года назад +1

      @@ruff3d приведение к строке, создание массива, реверс, джоин- это всё O(n) и O(n) space, сравнение строк просто O(n). Где вы увидели O(1) ? Может я что-то не так понимаю

    • @ruff3d
      @ruff3d 3 года назад

      @@NinjaNoobful n - указывает на количество итераций. В моем примере их нет. Возможно под капотом движок сделает какие-нить цыклы, но это явно оптимизировано

  • @TheSuroo7Channel
    @TheSuroo7Channel 2 года назад +1

    Не правильный код, 0 выдаст false, хотя 0 палиндром

    • @fusted4630
      @fusted4630 2 года назад

      почему 0 выдаст false?

    • @SerzhNesteruk
      @SerzhNesteruk Год назад

      ​@@fusted4630 Остаток от деления нуля на 10 равен нулю, поэтому сработет второй if и функция вернет false.
      Если поменять второй и третий if местами, тогда ноль возвращал бы true 🤔

  • @romanryaboshtan9270
    @romanryaboshtan9270 2 года назад

    Никто не найдёт решение с константой по памяти

  • @thismusic2581
    @thismusic2581 11 месяцев назад

    function isPolindrome (num) {
    let result = num.toString().split('').reverse().join('')
    if(num == +result) {
    return true
    }
    return false
    }
    console.log(isPolindrome(-12))

    • @thismusic2581
      @thismusic2581 11 месяцев назад

      как вам такое решение

    • @iamthevlad
      @iamthevlad 7 месяцев назад

      @@thismusic2581так условие, что нельзя переводить в строку

  • @SerzhNesteruk
    @SerzhNesteruk Год назад

    const isPalindromeNumber = num => {
    if (
    !Number.isInteger(num)
    || num < 0
    || num % 10 === 0 && num !== 0
    ) {
    return false;
    }
    let rev = 0;
    while (num > rev) {
    const digit = num % 10;
    rev = rev * 10 + digit;
    if (num > rev) {
    num = (num - digit) / 10;
    }
    }
    return num === rev;
    };

  • @АнастасияДанилюк-я7л
    @АнастасияДанилюк-я7л 3 года назад +1

    function reverse(a){
    var rev=function(n){
    let r = 0
    while(n != 0){
    r = r * 10 + n % 10
    n = Math.floor(n / 10)
    }
    return r
    }
    return a