Numeric palindrome | Solve the LeetCode problem in JavaScript

Поділитися
Вставка
  • Опубліковано 19 гру 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 роки тому

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

  • @ДмитрийБердик-ж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 2 роки тому

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

  • @ОлегБордуляк-й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ю Рад слышать! )

  • @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

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

  • @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 роки тому

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

  • @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 - указывает на количество итераций. В моем примере их нет. Возможно под капотом движок сделает какие-нить цыклы, но это явно оптимизировано

  • @Mr29061989
    @Mr29061989 2 роки тому

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

    • @frontendscience
      @frontendscience  2 роки тому

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

  • @quite10
    @quite10 3 роки тому

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

    • @frontendscience
      @frontendscience  3 роки тому +1

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

    • @quite10
      @quite10 3 роки тому

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

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 роки тому +1

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

    • @frontendscience
      @frontendscience  3 роки тому

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

    • @ЮляИванова-у3щ
      @ЮляИванова-у3щ 3 роки тому

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

  • @pupizoid100
    @pupizoid100 Рік тому

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

    • @МаксимХлопяник
      @МаксимХлопяник Рік тому

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

  • @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
    }

  • @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!

  • @romanryaboshtan9270
    @romanryaboshtan9270 3 роки тому

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

  • @Hol1net
    @Hol1net 3 роки тому

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

    • @frontendscience
      @frontendscience  3 роки тому

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

    • @Hol1net
      @Hol1net 3 роки тому

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

  • @ВероникаСампетова-ц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

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

  • @TheSuroo7Channel
    @TheSuroo7Channel 2 роки тому +1

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

    • @fusted4630
      @fusted4630 2 роки тому

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

    • @SerzhNesteruk
      @SerzhNesteruk Рік тому

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

  • @wisarty
    @wisarty 2 роки тому

    Дякую

  • @thismusic2581
    @thismusic2581 Рік тому

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

    • @thismusic2581
      @thismusic2581 Рік тому

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

    • @iamthevlad
      @iamthevlad 9 місяців тому

      @@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;
    };

  • @romanryaboshtan9270
    @romanryaboshtan9270 3 роки тому

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

  • @АнастасияДанилюк-я7л

    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