JavaScript 5 типовых задач на собеседовании, решаем их!

Поделиться
HTML-код
  • Опубликовано: 19 май 2019
  • Курс JS: js.itgid.info
    Курс верстки: html.itgid.info
    Интернет магазин на Node: node.itgid.info
    Плейлист: goo.gl/63osiv
    Телеграм: t.me/jsrules
    Мои курсы: itgid.info

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

  • @nickolaypanasyuk9711
    @nickolaypanasyuk9711 5 лет назад +7

    Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !

  • @MArt-lz9xu
    @MArt-lz9xu 5 лет назад +9

    Спасибо за решение задачи. Все по полочкам split.разложено, join.разжевано и в String положено :)

  • @user-fu9lf8mj1s
    @user-fu9lf8mj1s 5 лет назад

    Полностью поддерживаю Roman! Объясняет, раскладывая все по полочкам! Прохожу курс, очень довольна!

  • @user-fz7fe8cn7i
    @user-fz7fe8cn7i 5 лет назад +3

    Спасибо братка, крепкого тебе здоровья!

    • @itgid
      @itgid  5 лет назад +1

      Спасибо!

  • @near5090
    @near5090 5 лет назад +156

    понравилось, тока могли бы разделить по частям уроки а то люди будут думать что в этом видео все 5 задач

    • @itgid
      @itgid  5 лет назад +10

      Ок. Добавлю части!

    • @AwesomeMrUser
      @AwesomeMrUser 3 года назад +4

      ЛаверКейс ;)

    • @user-gl8qs7qj4k
      @user-gl8qs7qj4k 2 года назад +4

      @@itgid не добавили....

    • @coldym
      @coldym 2 года назад +4

      @@itgid все еще не добавили...

    • @user-qi7jq9so8g
      @user-qi7jq9so8g 2 года назад +3

      @@itgid все еще не добавили....

  • @user-yx4ov2xx8s
    @user-yx4ov2xx8s 5 лет назад

    Очень интересно! Ждём новой части!

  • @user-xq3hx1uz1r
    @user-xq3hx1uz1r 5 лет назад +4

    Классный канал. Я наконец понял работу с массивами.

    • @itgid
      @itgid  5 лет назад

      Супер!

  • @tivirp1997
    @tivirp1997 5 лет назад

    Класс, продолжай, как раз буду устраиваться js js se

  • @user-ot4zg4mv2r
    @user-ot4zg4mv2r 5 лет назад +5

    Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true.
    Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.

  • @user-yx2tq1bh1m
    @user-yx2tq1bh1m 5 лет назад +2

    Просто лучший в мире за работой.

  • @user-mh1lt6hv8i
    @user-mh1lt6hv8i 5 лет назад

    Алекс очень поступков и полезно спасибо!

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

    Отличное объяснение!!!!!!Спасибо!!

  • @eXacT9090
    @eXacT9090 5 лет назад +5

    Канал пушка!

    • @itgid
      @itgid  5 лет назад

      Ага, спасибо!

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

    Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!

  • @user-hp5hw8su8q
    @user-hp5hw8su8q 5 лет назад

    Круто, спасибо!

  • @Tipuchek
    @Tipuchek 5 лет назад +1

    Как обычно топчик)

    • @itgid
      @itgid  5 лет назад

      Спасибо!

  • @Max-kr4ie
    @Max-kr4ie 5 лет назад +9

    Благодарю. И жду новых. Интересно.

    • @itgid
      @itgid  5 лет назад +1

      Да, завтра будут новые.

  • @vovaseagull1097
    @vovaseagull1097 5 лет назад +1

    Очень круто объяснили
    спасибо!
    еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл

    • @itgid
      @itgid  5 лет назад

      да можно и самому, но обычно даже по такой маленькой задаче видно как и что.

  • @user-pv6rt9xo6y
    @user-pv6rt9xo6y 4 года назад

    очень понятно объясняте, спасибо

  • @stasmaksimov9531
    @stasmaksimov9531 5 лет назад

    Отличное видео! 👍

    • @itgid
      @itgid  5 лет назад

      Спасибо!

  • @alexsoft7073
    @alexsoft7073 4 года назад

    очень хорошая и простая задача. особенно решение. лайк

  • @tihon4979
    @tihon4979 5 лет назад +1

    Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.

    • @itgid
      @itgid  5 лет назад +1

      Спасибо!

  • @webdmitriev
    @webdmitriev 5 лет назад +1

    Классно)) мне понравилось такое решение))

    • @itgid
      @itgid  5 лет назад +2

      да, особенно прикольно от 3 операций к одной.

  • @dmitrypichugin7449
    @dmitrypichugin7449 5 лет назад +11

    Можно ничего не делать с входной строкой.
    Имеет значение четное число символов или нет.
    Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1).
    Если строка не четная, то символ в середине можно не смотреть.
    Почитайте книгу "Cracking coding interview".

    • @senioreasy
      @senioreasy 5 лет назад +1

      Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.

    • @MrRagday
      @MrRagday 5 лет назад +2

      "Аргентина манит негра"

    • @simplewebdev1098
      @simplewebdev1098 5 лет назад

      @@senioreasy верно, но только в JS 5/2 = 2.5. Нужно округлять, хотя, с другой стороны, не нужно. Ибо 3 всё равно > 2.5 так что для сравнения пойдёт.

    • @zhenshuang
      @zhenshuang 4 года назад

      Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.

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

      Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.

  • @numbersevenunderheaven1898
    @numbersevenunderheaven1898 4 года назад +7

    7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.

    • @sergei-sabitov
      @sergei-sabitov 3 года назад +1

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

  • @rainysky84
    @rainysky84 5 лет назад +38

    На видео на 4:14 -->> let str2 = str.split('');
    В 2019ом году для преобразования в массив проще писать let str2 = [...str1]
    Итераторы и деструктуризация во всей их красе :)

    • @user-il3xh5di2i
      @user-il3xh5di2i 4 года назад

      Да у автора проблемы с наименованием.

    • @apollon-8151
      @apollon-8151 Год назад +1

      то есть с помощью оператора spread можно из строки сделать массив? Надо будет попробовать на практике:)
      Спасибо за информацию

  • @idinaxuj100
    @idinaxuj100 3 года назад +11

    Скиньте видео с остальными 4 задачами? очень тяжеловато найти :(

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

    Этот палиндром мне теперь во сне как ужастик сниться будет 😅

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

    Спасибо большое

  • @olganovak209
    @olganovak209 5 лет назад +9

    Спасибо за уроки!
    По поводу палиндромов - классический пример "А роза упала на лапу Азора", т.е. предложение с пробелами :) неплохо бы наверное было бы почистить строку от пробелов, или даже от всех небуквенных символов (прежде всего знаков припинания)

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l 5 лет назад

      Все эти условия (эмодзи и прочее) зависит только от твоего представления палиндрома, лично я считаю что "А роза упала на лапу Азора" не является палиндромом.

    • @MrRagday
      @MrRagday 5 лет назад +1

      @@user-dp6yt7yc9l А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l 5 лет назад

      @@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.

    • @MrRagday
      @MrRagday 5 лет назад +1

      @@user-dp6yt7yc9l 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l 5 лет назад

      MrRagday в двоичной тоже, ну ну

  • @evgeniypp
    @evgeniypp 5 лет назад +6

    Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи.
    Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, "").
    Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".

  • @fvckthesociety1123
    @fvckthesociety1123 5 лет назад

    спасибо!

  • @burenkoigor1984
    @burenkoigor1984 3 года назад +10

    В палиндроме, я бы все же сделал
    const reversedString = str.split('').reverse().join('')
    return string === reversedString
    Так будет на одну строчку больше, но сразу повышается читаемость кода.

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

      function palindrome(str) {
      return str.toLowerCase().split('').reverse().join('') == str;
      }

  • @DJTooZoFF
    @DJTooZoFF 5 лет назад +4

    Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.

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

      в данном примере пробелы не учитываются

  • @Bunny_Love
    @Bunny_Love 4 года назад

    Очень круто

  • @baigarinovalibek4612
    @baigarinovalibek4612 5 лет назад +10

    Я в JS полный ноль, но с точки зрения производительности это не очень хорошо. Гонять туда сюда стринг в массив и массив в стринг это лишние операции. Я думаю на собеседованиях больше обращают внимание на производительность кода, а не его краткость (может быть JS исключение?:) ). С таким же успехом, задание на сортировку массива можно решить готовым методом типа sort(), но в корне не понимать как эта самая сортировка работает. Может быть хотя бы так
    const is_polyndrom = str => {
    var n=str.length;
    str=str.toLowerCase();
    for (let i=0;i

    • @artemkostylev2856
      @artemkostylev2856 5 лет назад

      А если у вас не четное количество букв? Тогда n/2 будет не целым числом и проверка сломается

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u 5 лет назад +1

      @@artemkostylev2856 ничего не сломается, при нечетной длине центральный символ не будет проверяться, что и не нужно для данной задачи

    • @artemkostylev2856
      @artemkostylev2856 5 лет назад

      Дмитрий Беляев понятно, спасибо

    • @Warox42
      @Warox42 5 лет назад +1

      Можно убрать ловер кейс, и делать ту ловер в иф конструкции для символов. Тогда на 1 проход будет меньше, что в данном случае являеться 50% сложности
      будет O(n) вместо O(2n)

    • @MrRagday
      @MrRagday 5 лет назад +3

      Всегда думал, что на собеседованиях ценится хорошо читаемый код, а не псевдообфусцированный.

  • @linaKaderhc
    @linaKaderhc 5 лет назад

    После строки " str2 = str2.join;
    "
    "str2" необходимо преобразовать в строку, поскольку на данный момент это массив.
    Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ".
    А второй вариант работает некорректно и всегда выводит "true".

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

    Спасибо;)

  • @ramforinh
    @ramforinh 5 лет назад +2

    Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.

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

      зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему

  • @dadtyler5702
    @dadtyler5702 5 лет назад

    Спасибо

  • @user-tp5sw9qx2m
    @user-tp5sw9qx2m 5 лет назад +3

    будет ли продолжение? а то написано 5 задач, а разобрали одну :)

  • @velyar
    @velyar 4 года назад +1

    Все бы так код разбирали как вы:)

  • @nightlair1215
    @nightlair1215 5 лет назад +2

    Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках.
    function palindrom(s){
    s = s.toLowerCase();
    s = s.split('');
    var flag = true;
    for(let i = 0;i

    • @lexSkiller
      @lexSkiller 5 лет назад

      Хороший пример

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u 5 лет назад

      только достаточно так проверить половину строки, да и сплитить строку не нужно

    • @Warox42
      @Warox42 5 лет назад

      Это не О(N)
      Ведь ту ловер кейс - полтный проход по строке
      потом сплит - полный проход по строке
      потом цикл. итого О(3n)
      А можно и правда за О(н)

    • @nightlair1215
      @nightlair1215 5 лет назад

      Алгоритм проходит 3 раза, но в асимптотике не записываются коэффициенты O(n/100) = O(100n) = O(n)

    • @MrRagday
      @MrRagday 5 лет назад

      В чем смысл ускорять некорректный код?

  • @ychetka
    @ychetka 5 лет назад

    написал за 2 минуты, пользуйся, по идее работает со всем в UTF-8
    function test (chars) {
    const normalise = chars.toUpperCase()
    let polindrom = ''
    for(let i = normalise.length; i > 0; i-- ){
    polindrom += normalise[i - 1]
    }
    return (polindrom == normalise)
    }

  • @simplewebdev1098
    @simplewebdev1098 5 лет назад

    Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п.
    Далее
    let count = Math.floor(arr.length/2);
    for (let i = 0; i < count; i++) {
    if(arr[i] != arr[arr.length-i])
    return false;
    }
    return true;
    Логика такова: если в массиве чётное количество элементов сравниваются попарно все. Если нечётное, средний элемент всё равно как-бы не влияет. Переменная count создана чтобы каждый цикл не вызывать Math.floor().

    • @MrRagday
      @MrRagday 5 лет назад

      Почему лет каунт, а не конст?

    • @simplewebdev1098
      @simplewebdev1098 5 лет назад +1

      @@MrRagday да, const тут правильнее будет. Но не люблю я, почему то, этот const. Не нравится он мне, и всё ))

  • @Marolafighter
    @Marolafighter 5 лет назад +1

    а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого:
    const length = str.length
    for(let i = 0; i < length/2; i++) {
    if (str[i] !== str[length - i - 1]) {
    return false
    }
    return true
    }
    return true
    ну это если уж совсем упарываться, если работа с малым количеством данных то и в одну строчку решение норм

    • @baigarinovalibek4612
      @baigarinovalibek4612 5 лет назад +1

      можно добежать до середины строки, этого будет достаточно

    • @Marolafighter
      @Marolafighter 5 лет назад

      @@baigarinovalibek4612 да, ты прав, всё-таки писать код в комментарии не очень удобно, пропустил этот момент

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

    супер, класно, велике дякую!

  • @entity9069
    @entity9069 5 лет назад

    спасибо

  • @artem98723
    @artem98723 5 лет назад +4

    Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить):
    переводим в нижний регистр, потом проходимся циклом for(var i = 0; i < str.length/2; i++) if(str[i] != str[str.length - i - 1]) return false;
    return true;
    Я бы хотел понять минусы (кроме смайлов) этих двух вариантов ,заранее Спасибо

    • @bloodrik
      @bloodrik 5 лет назад

      ваше решение является самым оптимальным, но на собеседованиях чаще хотят увидеть процесс именно ревёрса строки, в этом и цель.
      автор действительно показал не очень оптимальный вариант, ибо даже формирование новой строки по типу
      var res = "";
      for(let j = str.length-1; j>=0;--j)
      {
      res+=str[j];
      }
      является в 3 раза оптимальнее

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u 5 лет назад

      @@bloodrik бежать надо с таких собеседований, где "хотят неоптимально", особенно если Вы понимаете это, особенно если Вы джун (опыта набраться у Вас в такой конторке не получится)

    • @MrRagday
      @MrRagday 5 лет назад

      Вариант с методами лучше читается. Для формошлепства это важнее, чем "оптимизации", которые изменяют загрузку с мгновенно на чуть быстрее чем мгновенно. А там, где оптимизация - это важно, скорее всего решение этой задачки будет совсем не самой большой головной болью на собеседовании.

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l 5 лет назад

      Ты на интуиции программируешь?
      jsperf.com/palindrome/3

    • @simplewebdev1098
      @simplewebdev1098 5 лет назад

      @@MrRagday я не собеседователь, но, как по мне, гораздо важнее, чтобы человек понимал как это работает, чем знал волшебные слова (reverse, split, join). Научить заклинаниям можно и обезьяну, толпы jqery програмыздов (которые не знают нативный JS) не дадут соврать.

  • @denisstepanov3328
    @denisstepanov3328 5 лет назад

    Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.

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

    Еще есть такое решение:
    const func = str => {
    let string = str.toLowerCase().split('').reverse().join('');
    let result = (string == str) ? true : false;
    return result
    }
    console.log(func('abbba'));

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

      return string === str

  • @user-nd4sl1lp9b
    @user-nd4sl1lp9b 10 дней назад

    С латиницей всё понятно-все работает.А вот с кирилицей будет ли так же срабатывать,или нужно ещё чтото дополнительно?

  • @Roman-vl8su
    @Roman-vl8su 5 лет назад +28

    Лучший канал про Web

    • @itgid
      @itgid  5 лет назад +6

      Согласен!

    • @TheWorldPeace
      @TheWorldPeace 5 лет назад

      Самокритично)

  • @Cat-zh6xx
    @Cat-zh6xx Год назад

    Эх, решил задачу в 20 строк, совсем забыл про сплит и реверс, видимо еще учиться и учиться

  • @dimanarizhnyi391
    @dimanarizhnyi391 5 лет назад +3

    Тоже изучаю JS, но мне кажется есть еще один недочет. Если попросят проверить является ли строка палиндромом, то строка может содержать пробелы. Скажем, если передать в str "а роза упала на лапу азора" (что в тоже явялется строкой), такой вариант не сработает.
    То есть к минусам данного метода, я бы еще добавил "работает только для слов". Ведь задание "является ли строка", а не является ли "слово". Тут нужно быть внимательным к деталям.

    • @user-tp5sw9qx2m
      @user-tp5sw9qx2m 5 лет назад +1

      тогда скорее всего нужно избавится для начала от пробелов через replace, а потом все как в видео, конечно если просят вывести только true / false.

    • @3dzbot
      @3dzbot 5 лет назад

      palindrom('ab ba ab ba') сработало. пробелы не проблема

    • @dimanarizhnyi391
      @dimanarizhnyi391 5 лет назад

      @@3dzbotне самый лучший пример, сейчас я вам его сломаю. Проверьте "abb aab ba", что как бы тоже палиндром. Учитывайте индексы элементов строки.

    • @3dzbot
      @3dzbot 5 лет назад

      @@dimanarizhnyi391 -> str = str.toLowerCase().replace(/\s/g, ''); где со сменой регистра так же добавляем рег.выражение .replace(/\s/g, '') которое убирает пробелы со строки. "а роза азора" решена :)

    • @dimanarizhnyi391
      @dimanarizhnyi391 5 лет назад

      @@3dzbot да, но код явно отличается от того, что представлен в видео. Про это решение я тоже знаю.

  • @user-sn1tz8wn5l
    @user-sn1tz8wn5l 5 лет назад

    так же есть вот такой варинат функции, которая определяет палиндром
    function isPalindrome(num) {
    let str = String(num),
    sum = 0;
    for (let i = 0; i < str.length; i++) {
    let left = i;
    let right = str.length - 1 - i;
    if (str[left] == str[right]) {
    sum++;
    if (sum == str.length - 1)
    return true;
    }
    }
    return false;
    }

    • @MrRagday
      @MrRagday 5 лет назад

      Можно улучшить, сделав i

  • @jankaban2871
    @jankaban2871 4 года назад

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

  • @user-mh1lt6hv8i
    @user-mh1lt6hv8i 5 лет назад +1

    Алекс! А можем рассмотреть такой пример -
    Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон)
    Из базы данных подтягивается информация и выводит цены с учетом его скидки.

    • @theRusDerevnya
      @theRusDerevnya 5 лет назад

      В топ!

    • @ruslanfilyk2904
      @ruslanfilyk2904 5 лет назад +1

      Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.

    • @simplewebdev1098
      @simplewebdev1098 5 лет назад

      @@ruslanfilyk2904 в целом норм.

  • @zloy_tushkanchik
    @zloy_tushkanchik 5 лет назад

    Так вот где спец по js скрылся. Искал - не выходил нигде, а тут случайно наткнулся в рекомендациях. Однозначно подписка.

    • @MrRagday
      @MrRagday 5 лет назад

      Замечательного спеца нашли. Код которого не пройдет проверку первыми же примерами палиндромов из Википедии.

    • @zloy_tushkanchik
      @zloy_tushkanchik 5 лет назад

      @@MrRagday можете посоветовать что то или кого то лучше?

    • @MrRagday
      @MrRagday 5 лет назад

      @@zloy_tushkanchik learn.javascript.ru
      Да тот же соракс на три головы выше этого "спеца"

  • @user-iw3zt5sm7m
    @user-iw3zt5sm7m 5 лет назад

    я же правильно понимаю, что если это все вдруг понадобится в синхронном выполнении (ну мало ли - запросы к серверу), то это все дело надо обернуть в async/await или промисами?

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

    Лайк за Олега )) olleh ))

  • @ArthurYelkin
    @ArthurYelkin 5 лет назад

    Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом"
    На такой случай я знаю красивый алгоритм:
    // функция, которая разворачивает число по принципу чтения числа задом наперед
    const reverseNumber = num => {
    let result = 0;
    for (; Math.floor(num) !== 0; num /= 10) {
    result *= 10;
    result += Math.floor(num) % 10;
    }
    return result;
    };
    // функция, которая сопоставляет развернутое число с исходным
    const isPalindrom = num => reverseNumber(num) === num
    console.log(isPalindrom(121))
    // true
    console.log(isPalindrom(123)) // false

    • @MrRagday
      @MrRagday 5 лет назад

      С помощью str = "" + num; задача сводится к исходной =Р

    • @ArthurYelkin
      @ArthurYelkin 5 лет назад

      @@MrRagday а при чем тут str?

    • @MrRagday
      @MrRagday 5 лет назад

      @@ArthurYelkin Если со строкой просто, а для числа нужны отдельные алгоритмы, то не проще ли превратить число в строку и воспользоваться "простым" решением?

    • @ArthurYelkin
      @ArthurYelkin 5 лет назад +1

      @@MrRagday ну кстати логично)

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

    Имхо, я как собеседующий ожидал бы решение с 2мя циклами. Это реально показал бы умеет ли думать Джун или нет

  • @NeverGTI
    @NeverGTI 5 лет назад

    let pal = (str) => {
    if (typeof str != 'string') return false;
    let tmp = [];
    for(let c of str) {
    tmp.unshift(c);
    }
    return tmp.join('') == str;
    }
    Не лучше ли вот так написать?

  • @user-wb2jc5wu7d
    @user-wb2jc5wu7d 5 лет назад

    Как считаете? Если объединить код в return: return str = str.toLowerCase() && str == str.split('').reverse().join(''); // плохой ли это пример кода? (будут ли бить по рукам за это?)

    • @MrRagday
      @MrRagday 5 лет назад

      Это лучше чем никакого решения. Но не очень читабельно. Подумай сам: хочешь ли ты работать в конторе, в которой пишут нечитабельный код?

  • @sergekim5499
    @sergekim5499 5 лет назад +9

    Можно докапаюсь?)
    Я бы написал строгое сравнение, чтоб в случае проблем с типами, там можно было отловить ошибку)

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l 5 лет назад +2

      проблем с типами?)) приведите пример)
      любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)

    • @sergekim5499
      @sergekim5499 5 лет назад +2

      @@user-sn1tz8wn5l ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая

    • @agentsmith9708
      @agentsmith9708 5 лет назад

      да, лучше сразу привыкать

  • @user-yx7in9nl1d
    @user-yx7in9nl1d 4 года назад

    Я вот такое понаписывал:
    function palindrom() {
    let word = prompt("put a word").toLowerCase();
    let backWords = word.split("").reverse().join("");
    if (word == backWords) {
    return true;
    } else {
    return false;
    }
    }

  • @cikada3398
    @cikada3398 5 лет назад

    Можно добавить метод trim()

  • @user-sn1tz8wn5l
    @user-sn1tz8wn5l 5 лет назад

    мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют
    + если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО
    допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит.
    получается надо убирать еще и пунктуационные знаки.
    нюансов много

    • @MrRagday
      @MrRagday 5 лет назад

      Сказано же, что мешают эмодзи. Автор думает про действительно тонкие вещи, а вы с пробелами и пунктуационными знаками лезете =Р

  • @orlem5837
    @orlem5837 5 лет назад

    0) Где проверка входных данных?
    1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае.
    2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.

  • @TheOlius
    @TheOlius 5 лет назад +1

    1. toLowerCase можно тоже в возврат =).
    2. слово "abrba" тоже является полиндромом об этом ни слова
    3. данная задача даже не на ДЖУНА (по сути задача решается как и звучит (если развернуть слово наоборот то они будут равны), то есть ДУМАТЬ не нужно). Правильнее сформулированная задача о которой ты говоришь будет звучать так - "Определить, можно ли по входящей строке ПОСТРОИТЬ слово полиндром? то есть "abba" , "aabb" и "abbar" должны вернуть true, само слово строить не нужно, нужно лишь определить возможность." и вот тут начинаются сложности, при входящей строке в миллион символов... попробуй найти самое БЫСТРОЕ решение (АЛГОРИТМ) с МИНИМУМОМ циклов. Именно эту задачу задают при собеседовании на ПРОГРАММИСТА, а не определить что слово полиндром изначально... Которое решается в одну строчку.
    4. Лайк если хочешь знать решение реальной задачи

    • @TheOlius
      @TheOlius 5 лет назад

      в общем решил забить - правильный ответ:
      const isPolindromPossible = str => {
      let hashMap = [];
      str.split('').forEach(e => {
      let position = hashMap.indexOf(e)
      if (position >= 0) {
      hashMap.splice(position,1);
      }
      else {
      hashMap.push(e);
      }

      });
      return hashMap.length

    • @MrRagday
      @MrRagday 5 лет назад

      Отличная задача. Я так понимаю, что нужно сначала проверить длину строки, потом проверить символы на парность. Если длина непарная - допустима одна непарная буква, если парная - все буквы должны быть в четном количестве? Ответ не смотрел, так неспортивно =Р

    • @MrRagday
      @MrRagday 5 лет назад

      ​ Андрей Галкин посмотрел твое решение... подумал... Понял, что достаточно просто проверить буквы на парность. Если останется одна непарная или ноль - годно. Нет - нет ;)

    • @MrRagday
      @MrRagday 5 лет назад

      Кстати, вместо хешМеп-массива с прогонами индексОф-ом, можно сделать объект, а цикл проверяет есть ли свойство с именем, совпадающим с текущей буквой. если есть - удаляет его и идет к следующей букве, если нет - создает и идет к следующей букве.
      Задача *гораздо* лучше чем в видео! Спасибо еще раз!

    • @user-or1hy4xz8u
      @user-or1hy4xz8u 2 года назад

      @@TheOlius решальщик, пробелы и регистр у тебя учтены?

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

    понравилось

  • @user-qy9to3xr1m
    @user-qy9to3xr1m Год назад

    а какой у тебя опыт програмирования?

  • @user-fq8rb9ht5l
    @user-fq8rb9ht5l 5 лет назад

    А нового видоса нету или просто не найду?

  • @user-sg6gv6jq3z
    @user-sg6gv6jq3z 5 лет назад

    Как массив char рассмотреть строку вариант?

  • @zergzerg4844
    @zergzerg4844 4 месяца назад

    А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи
    function palindromeCheck(str: string) {
    let left = 1;
    const mid = Math.round(str.length - left / 2);
    const end = str.length - 1;
    while (left < mid) {
    if (str[left - 1] != str[str.length- (left - 1)]) return false;
    left++;
    }
    return true;
    }
    Нормально будет ? Или громоздко?

  • @prsion1925
    @prsion1925 5 лет назад +1

    сделайте Пожалуйста видео как настраивать гугл карты подробно

    • @itgid
      @itgid  5 лет назад

      Есть в курсе html.itgid.info

    • @jorgenUA
      @jorgenUA 5 лет назад

      www.w3schools.com/graphics/google_maps_intro.asp ... куда уж подробнее )

  • @MHM-hc8or
    @MHM-hc8or 5 лет назад

    👍

  • @sergiistryzg9699
    @sergiistryzg9699 5 лет назад +1

    Решил только у вас в раз 10 короче код чем у меня))
    const inputText = document.querySelector(".js_input");
    inputText.addEventListener("change", isPol);
    function isPol() {
    const inpValue = inputText.value.toLowerCase();
    const doArray = inpValue.split("");
    console.log(doArray);
    let count = doArray.length;
    // console.log(count);
    const doMirrou = doArray.reduce((newArr, el, idx, arr) => {
    count -= 1;
    newArr.push(arr[count]);
    return newArr;
    }, []);
    console.log(doMirrou);
    const isGood = doMirrou.map((letter, idx) => letter === doArray[idx]);
    console.log(isGood);
    const aaa = isGood.every(bul => bul);
    console.log(aaa);
    }

  • @CoonJS
    @CoonJS 4 года назад

    Если я передам число 101, ваш код сломается. Так как метода toLowerCase у Number нет.
    Можно переписать еще безопаснее и в одну строку, переписав название метода на isPalindrom (правило именования по возвращаемому типу переменной)
    const isPalindrom = str => str == String(str).toLowerCase().split('').reverse().join('')
    Плюсы моего решения:
    1) Строка
    2) Безопасно работает со всеми типами, за счет наличия String (работает с массивами, объектами и тд и тп)

    • @neonchik6768
      @neonchik6768 4 года назад

      Вроде написано что строку передают

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

    На прямую никто не изменяет аргументы функции..

  • @Metalscream
    @Metalscream 5 лет назад

    Какой то Олег получается

  • @evilishant9336
    @evilishant9336 5 лет назад +2

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

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

      @Из жизни изгоя/ Школьный Блог. судя по лексикону - детский сад

  • @raiden1860
    @raiden1860 5 лет назад +2

    Собеседование? Нет, не слышал ... )

  • @user-pq7dj1ny4h
    @user-pq7dj1ny4h 5 лет назад +1

    Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только ES6 синтаксис. Можете записать видео с решением?

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l 5 лет назад +1

      а в чем проблема?) вот, держите) написано на коленке за 5 минут
      class Salary {
      constructor() {
      this.rate = 0; // $/час
      this.experience = 0; // годы работы
      this.premium = 0; // премия
      this.spendHours = 0; // потрачено часов
      this.totalSalary = 0; // зп
      /*привязываем контекст (ES6 же... в es7 есть стрелочные методы, которым не надо байндить контекст:
      setRate = ( rate ) => {
      this.rate = rate;
      }
      }
      )*/
      this.setRate = this.setRate.bind( this );
      this.setExperience = this.setExperience.bind( this );
      this.setPremium = this.setPremium.bind( this );
      this.setSpendHours = this.setSpendHours.bind( this );
      this.calcTotalSalary = this.calcTotalSalary.bind( this );
      this.getTotalSalary = this.getTotalSalary.bind( this );
      }
      setRate ( rate ) {
      this.rate = rate;
      }
      setExperience ( experience ) {
      this.experience = experience;
      }
      setPremium ( premium ) {
      this.premium = premium;
      }
      setSpendHours ( spendHours ) {
      this.spendHours = spendHours;
      }
      calcTotalSalary () {
      const salary = this.rate * this.spendHours + this.premium; // основная зп
      const factor = this.experience / 2; // множитель опыта работы (взял из головы)
      this.totalSalary = salary + salary * factor; // итоговая зп = основная зп + зп за стаж.
      }
      getTotalSalary () {
      return this.totalSalary;
      }
      }
      const wage = new Salary;
      wage.setRate( 3 );
      wage.setExperience( 1 );
      wage.setPremium( 250 );
      wage.setSpendHours( 100 );
      wage.calcTotalSalary()
      console.log( wage.getTotalSalary() );

    • @user-pq7dj1ny4h
      @user-pq7dj1ny4h 5 лет назад

      @@user-sn1tz8wn5l Стрелочные методы идут с ES6 и выше, а не только начиная с ES7. А так да. Спасибо!

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l 5 лет назад

      @@user-pq7dj1ny4h стрелочные функции в ES6 появились, стрелочные методы в es7
      метод - это функция экземпляра класса

    • @MrRagday
      @MrRagday 5 лет назад

      На какую позицию собеседование?

    • @user-pq7dj1ny4h
      @user-pq7dj1ny4h 5 лет назад

      @@MrRagday junior front-end

  • @transfer6557
    @transfer6557 5 лет назад

    ну да, первая мысля показать 5 задач за 10 мин.? будет ли продолжение? и когда?

    • @MrRagday
      @MrRagday 5 лет назад

      Тебе тоже не хватило одного некорректного решения и нужно еще четыре?

  • @Mousehunter09
    @Mousehunter09 5 лет назад

    А это популярные задачи на джуниорскую должность или в принципе? Вряд ли же на должность Senior разработчика просят решить палиндром.

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u 5 лет назад

      от собеседующих во многом зависит... сам недавно по собеседованиям бегал на сеньера, и встречал разное, от банальных задачек из гугла, которые старше 5 лет (это при том, что в резюме у меня указан опыт проведения тех. собеседований), до вполне адекватных уровню "заревьювь код джуна", "построй архитектуру системы" ну или алгоритмические по типу "найди кратчайший путь во взвешенном графе".
      сам никогда не даю типовые задачи, только авторские, обязательно проверю понимание промисов, а так же умение загуглить/поискать на mdn

    • @Mousehunter09
      @Mousehunter09 5 лет назад

      @@user-yb3vy2wx8u понятно, спасибо. А от джуна тоже требуете/ожидаете хорошее понимание промисов?

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

    А имя функции не должно означать действие?

  • @grantruss5238
    @grantruss5238 5 лет назад +1

    Мне конечно очень интересно, но такие задачи по-видимо только логику улучшают ?
    На практике дела обстоят намного хуже ? Те же задачи про ООП на собеседовании никто не спрашивает, а если примут и человек не сможет выполнить реальную задачу ?

    • @marktsoy805
      @marktsoy805 5 лет назад

      ООП никто не спрашивает у js разрабов, потому что в нем нет ООП. соответственно ООП шаблоны проектирования не применимы. Ну главное наверно все таки чтобы логически человек мог представить, как что то должно работать

    • @grantruss5238
      @grantruss5238 5 лет назад

      А как же всякие там конструкторы и классы в объектно-ориентированном программировании ?

    • @marktsoy805
      @marktsoy805 5 лет назад

      ​@@grantruss5238Чтобы не было недопонимания в JS объекты и "классы" работают не так как в классическом ООП. По сути конструктор это просто функция возвращающая this. Что касается классов объявляя класс через относительно недавнюю фитчу class Name{} на самом вы объявляете функцию Name и добавляете на объект prototype методы это все не особо вяжется с классическим ООП.
      Хотя я понял наверно про что вы, когда говорили о практике. разрабу нужно понимать именно как работает js в нем очень много подводных камней один this и зоны видимости не мало нервных клеток убили наверно)) это довольно тяжело объяснить в рамках таких видео, ну и это не базовые вещи. Если вам интересно и есть какие то базовые знания в языке, можете найти серию книг "You Don't Know JS" (Кайл Симпсон) там довольно интересно и понятно все написано, по поводу объектов это "this & Object Prototypes"

    • @grantruss5238
      @grantruss5238 5 лет назад +1

      Дело в том, что на собеседовании нужно проверять самые глубины javascript, а не поверхность )

    • @MrRagday
      @MrRagday 5 лет назад

      Там, где знания джунов проверяются такими задачами, ооп еще не скоро придется применять.

  • @user-wl7ub4rj6m
    @user-wl7ub4rj6m 2 года назад

    function palindrom(str) {
    let stroka=str.toLowerCase();
    let strArr=stroka.split('')
    let revArr=''
    for (let i=strArr.length-1;i>=0;i--){
    revArr+=strArr[i]
    }
    return stroka==revArr?true:false
    }
    console.log(palindrom('abba'))

  • @bloodrik
    @bloodrik 5 лет назад

    Я сам по себе с++ разработчик, js знаю только ради того чтобы знать. Можете пожалуйста объяснить, чем ваш метод решения лучше чем обычное формирование строки (создаём новую строку и в цикле по 1 символу с конца к ней добавляем). Я не буду умничать или ещё что-то, ибо сам понимаю, что в вебе я не так уж и хорош, но если объективно смотреть со стороны, то ваше решение уступает в 3 раза по производительности. У вас в решении 3 перебора, соответственно это уже str.length*3 итераций, когда в решении формирования это просто str.length операций. Не знаю решает ли это проблему с эмодзи, но производительность явно выше, особенно если брать огромные строки. Объясните выбор именно этого решения, мне интересно почему, может я чего-то не понимаю?

    • @bloodrik
      @bloodrik 5 лет назад

      Мне кажется на собеседовании должны брать именно оптимальные решения, а не легко-читаемые.

    • @itgid
      @itgid  5 лет назад

      Все очень просто - мы можем сравнить и точно ответить. Скидывайте ваш метод решения.

    • @bloodrik
      @bloodrik 5 лет назад

      @@itgid
      function reverse(str)
      {
      str = str.toLowerCase();
      var res="";
      for(let i=str.length-1;i>=0;--i){
      res+=str[i];
      }
      return res==str;
      }

    • @baigarinovalibek4612
      @baigarinovalibek4612 5 лет назад

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

    • @bloodrik
      @bloodrik 5 лет назад

      @@baigarinovalibek4612 я же не делал проверку на палиндром дефолтным способом, я показал автору его же алгоритм только в 3 раза быстрее. А алгоритм это конкретно ревёрс строки с последующим сравнением с исходной строкой.

  • @user-lc2gd3nm9s
    @user-lc2gd3nm9s 3 года назад

    Получается Олег

  • @yugetio
    @yugetio 5 лет назад

    как лучше делать? И какая разница между spread оператором и простым методом split в данном случае?
    1. [...str].reverse().join()
    2. str.split('').reverse().join()

    • @Marolafighter
      @Marolafighter 5 лет назад +1

      конкретно в данном случае никакой, а так split() более гибкий, ты можешь пихать в него аргументы, которые будут определять как именно сплитить данные, но он медленнее чем spread, так что все зависит от контекста в котором ты пременяешь эти методы

    • @ale0x314
      @ale0x314 5 лет назад

      @@Marolafighter split быстрее спреда.

    • @Marolafighter
      @Marolafighter 5 лет назад

      @@ale0x314 хз, проверил в консоли, и спред быстрее

    • @MrRagday
      @MrRagday 5 лет назад

      Сплитом проще убрать пробелы и пунктуационные знаки.

  • @Ekscen
    @Ekscen 5 лет назад +1

    function check (str) {
    let str2 = "";
    for (let i = str.length - 1; i >= 0; i--){
    str2 += str[i];
    }
    console.log(str2 == str);
    }
    check ("ala");

    • @MrRagday
      @MrRagday 5 лет назад

      Не жадничай на знаки "="

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

    А потом опытный программист спросит "а как вы решите задачу с эмозди"

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

    решил по своему
    function palindrom(str) {
    str.toLowerCase();
    let validatePal = [...str].reverse().join('');
    if(str === validatePal) return true;
    else return false;
    }

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

    Ребята всем привет завтра на собеседоваине будет тест js волнуюсь необеснять моё первоё собеседование

  • @tommygun7913
    @tommygun7913 4 года назад

    зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение?
    const someName = str => {
    if (str.toLowerCase() == str.toLowerCase().split('').reverse().join('')) {
    return `${str} is palindrom`}
    else {return `${str} is not palindrom`};
    }
    console.log(someName('woW'));

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

    const palindrom = (str) => str === str.toLowerCase().split('').reverse().join('');

  • @user-ky7hj3sr5e
    @user-ky7hj3sr5e 2 года назад

    лайк