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

Sdílet
Vložit
  • čas přidán 19. 05. 2019
  • Курс JS: js.itgid.info
    Курс верстки: html.itgid.info
    Интернет магазин на Node: node.itgid.info
    Плейлист: goo.gl/63osiv
    Телеграм: t.me/jsrules
    Мои курсы: itgid.info

Komentáře • 396

  • @nickolaypanasyuk9711
    @nickolaypanasyuk9711 Před 5 lety +7

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

  • @MArt-lz9xu
    @MArt-lz9xu Před 5 lety +9

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

  • @near5090
    @near5090 Před 5 lety +156

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

    • @itgid
      @itgid  Před 5 lety +10

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

    • @AwesomeMrUser
      @AwesomeMrUser Před 4 lety +4

      ЛаверКейс ;)

    • @user-gl8qs7qj4k
      @user-gl8qs7qj4k Před 2 lety +4

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

    • @coldym
      @coldym Před 2 lety +4

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

    • @user-qi7jq9so8g
      @user-qi7jq9so8g Před 2 lety +3

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

  • @user-fu9lf8mj1s
    @user-fu9lf8mj1s Před 5 lety

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

  • @user-fz7fe8cn7i
    @user-fz7fe8cn7i Před 5 lety +3

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

    • @itgid
      @itgid  Před 5 lety +1

      Спасибо!

  • @user-xq3hx1uz1r
    @user-xq3hx1uz1r Před 5 lety +4

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

  • @user-yx4ov2xx8s
    @user-yx4ov2xx8s Před 5 lety

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

  • @user-ot4zg4mv2r
    @user-ot4zg4mv2r Před 5 lety +5

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

  • @tivirp1997
    @tivirp1997 Před 5 lety

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

  • @idinaxuj100
    @idinaxuj100 Před 3 lety +11

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

  • @user-yx2tq1bh1m
    @user-yx2tq1bh1m Před 5 lety +2

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

  • @user-mh1lt6hv8i
    @user-mh1lt6hv8i Před 5 lety

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

  • @eXacT9090
    @eXacT9090 Před 5 lety +5

    Канал пушка!

    • @itgid
      @itgid  Před 5 lety

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

  • @abolnikov
    @abolnikov Před 3 lety

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

  • @JavaScriptcher
    @JavaScriptcher Před 3 lety

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

  • @Tipuchek
    @Tipuchek Před 5 lety +1

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

    • @itgid
      @itgid  Před 5 lety

      Спасибо!

  • @user-hp5hw8su8q
    @user-hp5hw8su8q Před 5 lety

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

  • @vovaseagull1097
    @vovaseagull1097 Před 5 lety +1

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

    • @itgid
      @itgid  Před 5 lety

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

  • @user-pv6rt9xo6y
    @user-pv6rt9xo6y Před 4 lety

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

  • @alexsoft7073
    @alexsoft7073 Před 4 lety

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

  • @tihon4979
    @tihon4979 Před 5 lety +1

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

    • @itgid
      @itgid  Před 5 lety +1

      Спасибо!

  • @stasmaksimov9531
    @stasmaksimov9531 Před 5 lety

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

    • @itgid
      @itgid  Před 5 lety

      Спасибо!

  • @webdmitriev
    @webdmitriev Před 5 lety +1

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

    • @itgid
      @itgid  Před 5 lety +2

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

  • @user-tp5sw9qx2m
    @user-tp5sw9qx2m Před 5 lety +3

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

  • @dmitrypichugin7449
    @dmitrypichugin7449 Před 5 lety +11

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

    • @senioreasy
      @senioreasy Před 5 lety +1

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

    • @MrRagday
      @MrRagday Před 5 lety +2

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

    • @simplewebdev1098
      @simplewebdev1098 Před 5 lety

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

    • @zhenshuang
      @zhenshuang Před 4 lety

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

    • @AwesomeMrUser
      @AwesomeMrUser Před 4 lety +1

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

  • @user-sg6gv6jq3z
    @user-sg6gv6jq3z Před 5 lety

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

  • @user-fq8rb9ht5l
    @user-fq8rb9ht5l Před 5 lety

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

  • @artem98723
    @artem98723 Před 5 lety +4

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

    • @bloodrik
      @bloodrik Před 5 lety

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

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l Před 5 lety

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

    • @simplewebdev1098
      @simplewebdev1098 Před 5 lety

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

  • @user-iw3zt5sm7m
    @user-iw3zt5sm7m Před 5 lety

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

  • @Max-kr4ie
    @Max-kr4ie Před 5 lety +9

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

    • @itgid
      @itgid  Před 5 lety +1

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

  • @FilmsMediaTV
    @FilmsMediaTV Před rokem

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

  • @numbersevenunderheaven1898

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

    • @sergei-sabitov
      @sergei-sabitov Před 3 lety +1

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

  • @rainysky84
    @rainysky84 Před 5 lety +38

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

    • @user-il3xh5di2i
      @user-il3xh5di2i Před 4 lety

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

    • @apollon-8151
      @apollon-8151 Před rokem +1

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

  • @DJTooZoFF
    @DJTooZoFF Před 5 lety +4

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

    • @anastasiafanina8760
      @anastasiafanina8760 Před 2 lety

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

  • @user-wb2jc5wu7d
    @user-wb2jc5wu7d Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @nizomiddin_shahina
    @nizomiddin_shahina Před 3 lety

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

  • @olganovak209
    @olganovak209 Před 5 lety +9

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

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety +1

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

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety +1

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

    • @user-dp6yt7yc9l
      @user-dp6yt7yc9l Před 5 lety

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

  • @fvckthesociety1123
    @fvckthesociety1123 Před 5 lety

    спасибо!

  • @velyar
    @velyar Před 4 lety +1

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

  • @Bunny_Love
    @Bunny_Love Před 4 lety

    Очень круто

  • @evgeniypp
    @evgeniypp Před 5 lety +6

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

  • @onlynowmotivation
    @onlynowmotivation Před 3 lety

    Спасибо;)

  • @nightlair1215
    @nightlair1215 Před 5 lety +2

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

    • @lexSkiller
      @lexSkiller Před 5 lety

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

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u Před 5 lety

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

    • @Warox42
      @Warox42 Před 5 lety

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

    • @nightlair1215
      @nightlair1215 Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @NeverGTI
    @NeverGTI Před 5 lety

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

  • @burenkoigor1984
    @burenkoigor1984 Před 3 lety +10

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

    • @fuhait
      @fuhait Před rokem +1

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

  • @linaKaderhc
    @linaKaderhc Před 5 lety

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

  • @baigarinovalibek4612
    @baigarinovalibek4612 Před 5 lety +11

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

    • @artemkostylev2856
      @artemkostylev2856 Před 5 lety

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

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u Před 5 lety +1

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

    • @artemkostylev2856
      @artemkostylev2856 Před 5 lety

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

    • @Warox42
      @Warox42 Před 5 lety +1

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

    • @MrRagday
      @MrRagday Před 5 lety +3

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

  • @user-qy9to3xr1m
    @user-qy9to3xr1m Před rokem

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

  • @dadtyler5702
    @dadtyler5702 Před 5 lety

    Спасибо

  • @ivanvano8571
    @ivanvano8571 Před 3 lety

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

  • @entity9069
    @entity9069 Před 5 lety

    спасибо

  • @user-nd4sl1lp9b
    @user-nd4sl1lp9b Před měsícem

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

  • @Cat-zh6xx
    @Cat-zh6xx Před rokem

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

  • @Minty290
    @Minty290 Před 3 lety +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 Před 3 lety

      return string === str

  • @Marolafighter
    @Marolafighter Před 5 lety +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 Před 5 lety +1

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

    • @Marolafighter
      @Marolafighter Před 5 lety

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

  • @ychetka
    @ychetka Před 5 lety

    написал за 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 Před 5 lety

    Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п.
    Далее
    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 Před 5 lety

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

    • @simplewebdev1098
      @simplewebdev1098 Před 5 lety +1

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

  • @ramforinh
    @ramforinh Před 5 lety +2

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

    • @pavelharelyshau6106
      @pavelharelyshau6106 Před rokem

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

  • @rmstr7
    @rmstr7 Před 2 lety

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

  • @cikada3398
    @cikada3398 Před 5 lety

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

  • @yugetio
    @yugetio Před 5 lety

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

    • @Marolafighter
      @Marolafighter Před 5 lety +1

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

    • @ale0x314
      @ale0x314 Před 5 lety

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

    • @Marolafighter
      @Marolafighter Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @Roman-vl8su
    @Roman-vl8su Před 5 lety +28

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

  • @MaksimGolitsyn
    @MaksimGolitsyn Před 4 lety

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

  • @zergzerg4844
    @zergzerg4844 Před 5 měsíci

    А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи
    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 Před 5 lety +1

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

    • @itgid
      @itgid  Před 5 lety

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

    • @jorgenUA
      @jorgenUA Před 5 lety

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

  • @jankaban2871
    @jankaban2871 Před 4 lety

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

  • @denisstepanov3328
    @denisstepanov3328 Před 5 lety

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

  • @user-pq7dj1ny4h
    @user-pq7dj1ny4h Před 5 lety +1

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

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l Před 5 lety +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 Před 5 lety

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

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @user-pq7dj1ny4h
      @user-pq7dj1ny4h Před 5 lety

      @@MrRagday junior front-end

  • @user-sn1tz8wn5l
    @user-sn1tz8wn5l Před 5 lety

    так же есть вот такой варинат функции, которая определяет палиндром
    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 Před 5 lety

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

  • @zloy_tushkanchik
    @zloy_tushkanchik Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @zloy_tushkanchik
      @zloy_tushkanchik Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @sergekim
    @sergekim Před 5 lety +9

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

    • @user-sn1tz8wn5l
      @user-sn1tz8wn5l Před 5 lety +2

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

    • @sergekim
      @sergekim Před 5 lety +2

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

    • @agentsmith9708
      @agentsmith9708 Před 5 lety

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

  • @jewgenijmoldawski3306
    @jewgenijmoldawski3306 Před 3 lety +1

    Никогда не понимал, зачем в js нужна функция reverse. Ни разу в практике не понадобилась. Может кто-то знает?

    • @TalkerTube
      @TalkerTube Před 3 lety +1

      Чтобы задачки на собеседованиях решать ))

  • @user-mh1lt6hv8i
    @user-mh1lt6hv8i Před 5 lety +1

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

    • @theRusDerevnya
      @theRusDerevnya Před 5 lety

      В топ!

    • @ruslanfilyk2904
      @ruslanfilyk2904 Před 5 lety +1

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

    • @simplewebdev1098
      @simplewebdev1098 Před 5 lety

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

  • @dimanarizhnyi391
    @dimanarizhnyi391 Před 5 lety +3

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

    • @user-tp5sw9qx2m
      @user-tp5sw9qx2m Před 5 lety +1

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

    • @3dzbot
      @3dzbot Před 5 lety

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

    • @dimanarizhnyi391
      @dimanarizhnyi391 Před 5 lety

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

    • @3dzbot
      @3dzbot Před 5 lety

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

    • @dimanarizhnyi391
      @dimanarizhnyi391 Před 5 lety

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

  • @evilishant9336
    @evilishant9336 Před 5 lety +2

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

    • @TalkerTube
      @TalkerTube Před 3 lety

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

  • @CoonJS
    @CoonJS Před 4 lety

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

    • @neonchik6768
      @neonchik6768 Před 4 lety

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

  • @Mousehunter09
    @Mousehunter09 Před 5 lety

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

    • @user-yb3vy2wx8u
      @user-yb3vy2wx8u Před 5 lety

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

    • @Mousehunter09
      @Mousehunter09 Před 5 lety

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

  • @j7sx
    @j7sx Před 5 lety +1

    А строку разве нельзя развернуть не переводя в массив?

    • @j7sx
      @j7sx Před 5 lety

      @@sleepstream9433 ну как бы нах заморачиваться с массивом, если можно строку развернуть и сравнить

    • @j7sx
      @j7sx Před 5 lety

      @@sleepstream9433 странное конечно решение, особенно если знаком с python

    • @j7sx
      @j7sx Před 5 lety

      @@sleepstream9433 ну ну..

  • @grantruss5238
    @grantruss5238 Před 5 lety +1

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

    • @marktsoy805
      @marktsoy805 Před 5 lety

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

    • @grantruss5238
      @grantruss5238 Před 5 lety

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

    • @marktsoy805
      @marktsoy805 Před 5 lety

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

    • @grantruss5238
      @grantruss5238 Před 5 lety +1

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @user-yx7in9nl1d
    @user-yx7in9nl1d Před 4 lety

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

  • @NarkotikAsd
    @NarkotikAsd Před 3 lety

    понравилось

  • @azatgalyautdinov3548
    @azatgalyautdinov3548 Před rokem

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

  • @Metalscream
    @Metalscream Před 5 lety

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

  • @raiden1860
    @raiden1860 Před 5 lety +2

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

  • @ArthurYelkin
    @ArthurYelkin Před 5 lety

    Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом"
    На такой случай я знаю красивый алгоритм:
    // функция, которая разворачивает число по принципу чтения числа задом наперед
    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 Před 5 lety

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

    • @ArthurYelkin
      @ArthurYelkin Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @ArthurYelkin
      @ArthurYelkin Před 5 lety +1

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

  • @transfer6557
    @transfer6557 Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @russian2475
    @russian2475 Před 3 lety +1

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

  • @bloodrik
    @bloodrik Před 5 lety

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

    • @bloodrik
      @bloodrik Před 5 lety

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

    • @itgid
      @itgid  Před 5 lety

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

    • @bloodrik
      @bloodrik Před 5 lety

      @@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 Před 5 lety

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

    • @bloodrik
      @bloodrik Před 5 lety

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

  • @orlem5837
    @orlem5837 Před 5 lety

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

  • @user-zs6rk9qf5o
    @user-zs6rk9qf5o Před 5 lety

    ребята помогите решить пожалуйста
    На вход подается фраза на русском языке, содержащая числительное. Например, "Я хочу квартиру за 10.5 миллионов" или "Мне нравится когда моя машина, стоимостью сотку штук баксов, мелькает по телевизору". Необходимо выделить числительное в форме натурального числа и вернуть.

  • @user-ky7hj3sr5e
    @user-ky7hj3sr5e Před 3 lety

    лайк

  • @user-sn1tz8wn5l
    @user-sn1tz8wn5l Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

  • @sergiistryzg9699
    @sergiistryzg9699 Před 5 lety +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);
    }

  • @ArtinoBear
    @ArtinoBear Před 3 lety

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

  • @TheOlius
    @TheOlius Před 5 lety +1

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

    • @TheOlius
      @TheOlius Před 5 lety

      в общем решил забить - правильный ответ:
      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 Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @MrRagday
      @MrRagday Před 5 lety

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

    • @user-or1hy4xz8u
      @user-or1hy4xz8u Před 2 lety

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

  • @MHM-hc8or
    @MHM-hc8or Před 5 lety

    👍

  • @SergMirny_yt
    @SergMirny_yt Před 5 lety

    А в js нельзя работать со строкой как с массивом по умолчанию, без сплита? Что нибудь типа str[0] - возвращает 1-й символ?

    • @arkadych
      @arkadych Před 5 lety +1

      Можно. Доступ к элементу строки можно получить как раз с помощью str[index] или str.charAt(index).Только строка это не массив ))) По сути ты сам можешь переложить из строки каждый элемент в массив, но зачем когда есть split() ?

    • @SergMirny_yt
      @SergMirny_yt Před 5 lety +1

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

    • @arkadych
      @arkadych Před 5 lety +1

      ​@@SergMirny_yt, Всё верно, можно начиная с конца строки скопировать все элементы строки в новую и сравнить их и этот метод скорей всего будет работать быстрей.

  • @Ekscen
    @Ekscen Před 5 lety +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 Před 5 lety

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

  • @tommygun7913
    @tommygun7913 Před 4 lety

    зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение?
    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'));

  • @Wide841
    @Wide841 Před 3 lety

    С числами не работает этот метод