JavaScript 5 типовых задач на собеседовании, решаем их!
Курс JS: js.itgid.info Курс верстки: html.itgid.info Интернет магазин на Node: node.itgid.info Плейлист: goo.gl/63osiv Телеграм: t.me/jsrules Мои курсы: itgid.info
Жүктеу.....
Пікірлер: 396
@nickolaypanasyuk97115 жыл бұрын
Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !
@MArt-lz9xu5 жыл бұрын
Спасибо за решение задачи. Все по полочкам split.разложено, join.разжевано и в String положено :)
@user-fu9lf8mj1s5 жыл бұрын
Полностью поддерживаю Roman! Объясняет, раскладывая все по полочкам! Прохожу курс, очень довольна!
@user-fz7fe8cn7i5 жыл бұрын
Спасибо братка, крепкого тебе здоровья!
@itgid
5 жыл бұрын
Спасибо!
@user-yx4ov2xx8s5 жыл бұрын
Очень интересно! Ждём новой части!
@user-xq3hx1uz1r5 жыл бұрын
Классный канал. Я наконец понял работу с массивами.
@itgid
5 жыл бұрын
Супер!
@user-yx2tq1bh1m5 жыл бұрын
Просто лучший в мире за работой.
@near50905 жыл бұрын
понравилось, тока могли бы разделить по частям уроки а то люди будут думать что в этом видео все 5 задач
@itgid
5 жыл бұрын
Ок. Добавлю части!
@AwesomeMrUser
4 жыл бұрын
ЛаверКейс ;)
@user-gl8qs7qj4k
2 жыл бұрын
@@itgid не добавили....
@coldym
2 жыл бұрын
@@itgid все еще не добавили...
@user-qi7jq9so8g
2 жыл бұрын
@@itgid все еще не добавили....
@tivirp19975 жыл бұрын
Класс, продолжай, как раз буду устраиваться js js se
@user-mh1lt6hv8i5 жыл бұрын
Алекс очень поступков и полезно спасибо!
@eXacT90905 жыл бұрын
Канал пушка!
@itgid
5 жыл бұрын
Ага, спасибо!
@JavaScriptcher3 жыл бұрын
Отличное объяснение!!!!!!Спасибо!!
@Tipuchek5 жыл бұрын
Как обычно топчик)
@itgid
5 жыл бұрын
Спасибо!
@user-ot4zg4mv2r5 жыл бұрын
Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true. Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.
@user-hp5hw8su8q5 жыл бұрын
Круто, спасибо!
@user-pv6rt9xo6y4 жыл бұрын
очень понятно объясняте, спасибо
@abolnikov3 жыл бұрын
Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!
@stasmaksimov95315 жыл бұрын
Отличное видео! 👍
@itgid
5 жыл бұрын
Спасибо!
@alexsoft70734 жыл бұрын
очень хорошая и простая задача. особенно решение. лайк
@webdmitriev5 жыл бұрын
Классно)) мне понравилось такое решение))
@itgid
5 жыл бұрын
да, особенно прикольно от 3 операций к одной.
@FilmsMediaTV Жыл бұрын
Этот палиндром мне теперь во сне как ужастик сниться будет 😅
@Max-kr4ie5 жыл бұрын
Благодарю. И жду новых. Интересно.
@itgid
5 жыл бұрын
Да, завтра будут новые.
@vovaseagull10975 жыл бұрын
Очень круто объяснили спасибо! еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл
@itgid
5 жыл бұрын
да можно и самому, но обычно даже по такой маленькой задаче видно как и что.
@ivanvano85713 жыл бұрын
супер, класно, велике дякую!
@idinaxuj1003 жыл бұрын
Скиньте видео с остальными 4 задачами? очень тяжеловато найти :(
@tihon49795 жыл бұрын
Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.
@itgid
5 жыл бұрын
Спасибо!
@nizomiddin_shahina3 жыл бұрын
Спасибо большое
@ychetka5 жыл бұрын
написал за 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) }
@fvckthesociety11235 жыл бұрын
спасибо!
@user-tp5sw9qx2m5 жыл бұрын
будет ли продолжение? а то написано 5 задач, а разобрали одну :)
@rainysky845 жыл бұрын
На видео на 4:14 -->> let str2 = str.split(''); В 2019ом году для преобразования в массив проще писать let str2 = [...str1] Итераторы и деструктуризация во всей их красе :)
@user-il3xh5di2i
4 жыл бұрын
Да у автора проблемы с наименованием.
@apollon-8151
Жыл бұрын
то есть с помощью оператора spread можно из строки сделать массив? Надо будет попробовать на практике:) Спасибо за информацию
@numbersevenunderheaven18984 жыл бұрын
7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.
@sergei-sabitov
3 жыл бұрын
для того чтобы избежать мутирования можно использовать slice() или concat() перед самим ревёрсом, тогда получится новый массив, но т.к. мы нигде с исходным массивом не взаимодействуем, это лишний код который просто нагружает логику. Плюс декларативные конструкции(как в окончательном решении) читать и понимать намного легче чем то, что было в начале
@Bunny_Love4 жыл бұрын
Очень круто
@linaKaderhc5 жыл бұрын
После строки " str2 = str2.join; " "str2" необходимо преобразовать в строку, поскольку на данный момент это массив. Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ". А второй вариант работает некорректно и всегда выводит "true".
@onlynowmotivation2 жыл бұрын
Спасибо;)
@dmitrypichugin74495 жыл бұрын
Можно ничего не делать с входной строкой. Имеет значение четное число символов или нет. Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1). Если строка не четная, то символ в середине можно не смотреть. Почитайте книгу "Cracking coding interview".
@senioreasy
5 жыл бұрын
Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.
@MrRagday
5 жыл бұрын
"Аргентина манит негра"
@simplewebdev1098
5 жыл бұрын
@@senioreasy верно, но только в JS 5/2 = 2.5. Нужно округлять, хотя, с другой стороны, не нужно. Ибо 3 всё равно > 2.5 так что для сравнения пойдёт.
@zhenshuang
4 жыл бұрын
Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.
@AwesomeMrUser
4 жыл бұрын
Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.
@dadtyler57025 жыл бұрын
Спасибо
@user-nd4sl1lp9b18 күн бұрын
С латиницей всё понятно-все работает.А вот с кирилицей будет ли так же срабатывать,или нужно ещё чтото дополнительно?
@evgeniypp5 жыл бұрын
Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи. Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, ""). Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".
@burenkoigor19843 жыл бұрын
В палиндроме, я бы все же сделал const reversedString = str.split('').reverse().join('') return string === reversedString Так будет на одну строчку больше, но сразу повышается читаемость кода.
@fuhait
Жыл бұрын
function palindrome(str) { return str.toLowerCase().split('').reverse().join('') == str; }
@user-iw3zt5sm7m5 жыл бұрын
я же правильно понимаю, что если это все вдруг понадобится в синхронном выполнении (ну мало ли - запросы к серверу), то это все дело надо обернуть в async/await или промисами?
@velyar4 жыл бұрын
Все бы так код разбирали как вы:)
@baigarinovalibek46125 жыл бұрын
Я в JS полный ноль, но с точки зрения производительности это не очень хорошо. Гонять туда сюда стринг в массив и массив в стринг это лишние операции. Я думаю на собеседованиях больше обращают внимание на производительность кода, а не его краткость (может быть JS исключение?:) ). С таким же успехом, задание на сортировку массива можно решить готовым методом типа sort(), но в корне не понимать как эта самая сортировка работает. Может быть хотя бы так const is_polyndrom = str => { var n=str.length; str=str.toLowerCase(); for (let i=0;i
@artemkostylev2856
5 жыл бұрын
А если у вас не четное количество букв? Тогда n/2 будет не целым числом и проверка сломается
@user-yb3vy2wx8u
5 жыл бұрын
@@artemkostylev2856 ничего не сломается, при нечетной длине центральный символ не будет проверяться, что и не нужно для данной задачи
@artemkostylev2856
5 жыл бұрын
Дмитрий Беляев понятно, спасибо
@Warox42
5 жыл бұрын
Можно убрать ловер кейс, и делать ту ловер в иф конструкции для символов. Тогда на 1 проход будет меньше, что в данном случае являеться 50% сложности будет O(n) вместо O(2n)
@MrRagday
5 жыл бұрын
Всегда думал, что на собеседованиях ценится хорошо читаемый код, а не псевдообфусцированный.
@entity90695 жыл бұрын
спасибо
@Roman-vl8su5 жыл бұрын
Лучший канал про Web
@itgid
5 жыл бұрын
Согласен!
@TheWorldPeace
5 жыл бұрын
Самокритично)
@nightlair12155 жыл бұрын
Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках. function palindrom(s){ s = s.toLowerCase(); s = s.split(''); var flag = true; for(let i = 0;i
@lexSkiller
5 жыл бұрын
Хороший пример
@user-yb3vy2wx8u
5 жыл бұрын
только достаточно так проверить половину строки, да и сплитить строку не нужно
@Warox42
5 жыл бұрын
Это не О(N) Ведь ту ловер кейс - полтный проход по строке потом сплит - полный проход по строке потом цикл. итого О(3n) А можно и правда за О(н)
@nightlair1215
5 жыл бұрын
Алгоритм проходит 3 раза, но в асимптотике не записываются коэффициенты O(n/100) = O(100n) = O(n)
@MrRagday
5 жыл бұрын
В чем смысл ускорять некорректный код?
@simplewebdev10985 жыл бұрын
Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п. Далее let count = Math.floor(arr.length/2); for (let i = 0; i if(arr[i] != arr[arr.length-i]) return false; } return true; Логика такова: если в массиве чётное количество элементов сравниваются попарно все. Если нечётное, средний элемент всё равно как-бы не влияет. Переменная count создана чтобы каждый цикл не вызывать Math.floor().
@MrRagday
5 жыл бұрын
Почему лет каунт, а не конст?
@simplewebdev1098
5 жыл бұрын
@@MrRagday да, const тут правильнее будет. Но не люблю я, почему то, этот const. Не нравится он мне, и всё ))
@denisstepanov33285 жыл бұрын
Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.
@Minty2903 жыл бұрын
Еще есть такое решение: const func = str => { let string = str.toLowerCase().split('').reverse().join(''); let result = (string == str) ? true : false; return result } console.log(func('abbba'));
@r45her
3 жыл бұрын
return string === str
@user-sg6gv6jq3z5 жыл бұрын
Как массив char рассмотреть строку вариант?
@user-qy9to3xr1m Жыл бұрын
а какой у тебя опыт програмирования?
@olganovak2095 жыл бұрын
Спасибо за уроки! По поводу палиндромов - классический пример "А роза упала на лапу Азора", т.е. предложение с пробелами :) неплохо бы наверное было бы почистить строку от пробелов, или даже от всех небуквенных символов (прежде всего знаков припинания)
@user-dp6yt7yc9l
5 жыл бұрын
Все эти условия (эмодзи и прочее) зависит только от твоего представления палиндрома, лично я считаю что "А роза упала на лапу Азора" не является палиндромом.
@MrRagday
5 жыл бұрын
@@user-dp6yt7yc9l А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?
@user-dp6yt7yc9l
5 жыл бұрын
@@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.
@MrRagday
5 жыл бұрын
@@user-dp6yt7yc9l 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)
@user-dp6yt7yc9l
5 жыл бұрын
MrRagday в двоичной тоже, ну ну
@zloy_tushkanchik5 жыл бұрын
Так вот где спец по js скрылся. Искал - не выходил нигде, а тут случайно наткнулся в рекомендациях. Однозначно подписка.
@MrRagday
5 жыл бұрын
Замечательного спеца нашли. Код которого не пройдет проверку первыми же примерами палиндромов из Википедии.
@zloy_tushkanchik
5 жыл бұрын
@@MrRagday можете посоветовать что то или кого то лучше?
@MrRagday
5 жыл бұрын
@@zloy_tushkanchik learn.javascript.ru Да тот же соракс на три головы выше этого "спеца"
@user-fq8rb9ht5l5 жыл бұрын
А нового видоса нету или просто не найду?
@rmstr72 жыл бұрын
Лайк за Олега )) olleh ))
@artem987235 жыл бұрын
Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить): переводим в нижний регистр, потом проходимся циклом for(var i = 0; i return true; Я бы хотел понять минусы (кроме смайлов) этих двух вариантов ,заранее Спасибо
@bloodrik
5 жыл бұрын
ваше решение является самым оптимальным, но на собеседованиях чаще хотят увидеть процесс именно ревёрса строки, в этом и цель. автор действительно показал не очень оптимальный вариант, ибо даже формирование новой строки по типу var res = ""; for(let j = str.length-1; j>=0;--j) { res+=str[j]; } является в 3 раза оптимальнее
@user-yb3vy2wx8u
5 жыл бұрын
@@bloodrik бежать надо с таких собеседований, где "хотят неоптимально", особенно если Вы понимаете это, особенно если Вы джун (опыта набраться у Вас в такой конторке не получится)
@MrRagday
5 жыл бұрын
Вариант с методами лучше читается. Для формошлепства это важнее, чем "оптимизации", которые изменяют загрузку с мгновенно на чуть быстрее чем мгновенно. А там, где оптимизация - это важно, скорее всего решение этой задачки будет совсем не самой большой головной болью на собеседовании.
@user-dp6yt7yc9l
5 жыл бұрын
Ты на интуиции программируешь? jsperf.com/palindrome/3
@simplewebdev1098
5 жыл бұрын
@@MrRagday я не собеседователь, но, как по мне, гораздо важнее, чтобы человек понимал как это работает, чем знал волшебные слова (reverse, split, join). Научить заклинаниям можно и обезьяну, толпы jqery програмыздов (которые не знают нативный JS) не дадут соврать.
@ramforinh5 жыл бұрын
Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.
@pavelharelyshau6106
11 ай бұрын
зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему
@DJTooZoFF5 жыл бұрын
Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.
@anastasiafanina8760
2 жыл бұрын
в данном примере пробелы не учитываются
@jankaban28714 жыл бұрын
это на джуна, чет очень легко, я бы попросил что бы строку разбили на слова и вырезали из нее слова палиндромы, и потом еще про сложность спросил этого решения... может развернуть их порядок в предложении ) ... в принципе не намного сложнее а места для полёта фантазии уже больше, и решать и проверять интереснее... хотя возможно я на собесах давно не был )
@Cat-zh6xx Жыл бұрын
Эх, решил задачу в 20 строк, совсем забыл про сплит и реверс, видимо еще учиться и учиться
@user-sn1tz8wn5l5 жыл бұрын
так же есть вот такой варинат функции, которая определяет палиндром function isPalindrome(num) { let str = String(num), sum = 0; for (let i = 0; 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
5 жыл бұрын
Можно улучшить, сделав i
@user-wb2jc5wu7d5 жыл бұрын
Как считаете? Если объединить код в return: return str = str.toLowerCase() && str == str.split('').reverse().join(''); // плохой ли это пример кода? (будут ли бить по рукам за это?)
@MrRagday
5 жыл бұрын
Это лучше чем никакого решения. Но не очень читабельно. Подумай сам: хочешь ли ты работать в конторе, в которой пишут нечитабельный код?
@azatgalyautdinov3548 Жыл бұрын
Имхо, я как собеседующий ожидал бы решение с 2мя циклами. Это реально показал бы умеет ли думать Джун или нет
@Ekscen5 жыл бұрын
function check (str) { let str2 = ""; for (let i = str.length - 1; i >= 0; i--){ str2 += str[i]; } console.log(str2 == str); } check ("ala");
@MrRagday
5 жыл бұрын
Не жадничай на знаки "="
@Marolafighter5 жыл бұрын
а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого: const length = str.length for(let i = 0; i if (str[i] !== str[length - i - 1]) { return false } return true } return true ну это если уж совсем упарываться, если работа с малым количеством данных то и в одну строчку решение норм
@baigarinovalibek4612
5 жыл бұрын
можно добежать до середины строки, этого будет достаточно
@Marolafighter
5 жыл бұрын
@@baigarinovalibek4612 да, ты прав, всё-таки писать код в комментарии не очень удобно, пропустил этот момент
@orlem58375 жыл бұрын
0) Где проверка входных данных? 1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае. 2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.
@NarkotikAsd3 жыл бұрын
понравилось
@NeverGTI5 жыл бұрын
let pal = (str) => { if (typeof str != 'string') return false; let tmp = []; for(let c of str) { tmp.unshift(c); } return tmp.join('') == str; } Не лучше ли вот так написать?
@user-yx7in9nl1d4 жыл бұрын
Я вот такое понаписывал: function palindrom() { let word = prompt("put a word").toLowerCase(); let backWords = word.split("").reverse().join(""); if (word == backWords) { return true; } else { return false; } }
@ArthurYelkin5 жыл бұрын
Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом" На такой случай я знаю красивый алгоритм: // функция, которая разворачивает число по принципу чтения числа задом наперед 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
5 жыл бұрын
С помощью str = "" + num; задача сводится к исходной =Р
@ArthurYelkin
5 жыл бұрын
@@MrRagday а при чем тут str?
@MrRagday
5 жыл бұрын
@@ArthurYelkin Если со строкой просто, а для числа нужны отдельные алгоритмы, то не проще ли превратить число в строку и воспользоваться "простым" решением?
@ArthurYelkin
5 жыл бұрын
@@MrRagday ну кстати логично)
@MaksimGolitsyn3 жыл бұрын
А имя функции не должно означать действие?
@sergiistryzg96995 жыл бұрын
Решил только у вас в раз 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); }
@russian24753 жыл бұрын
На прямую никто не изменяет аргументы функции..
@zergzerg48444 ай бұрын
А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи function palindromeCheck(str: string) { let left = 1; const mid = Math.round(str.length - left / 2); const end = str.length - 1; while (left if (str[left - 1] != str[str.length- (left - 1)]) return false; left++; } return true; } Нормально будет ? Или громоздко?
@user-ky7hj3sr5e3 жыл бұрын
лайк
@cikada33985 жыл бұрын
Можно добавить метод trim()
@user-mh1lt6hv8i5 жыл бұрын
Алекс! А можем рассмотреть такой пример - Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон) Из базы данных подтягивается информация и выводит цены с учетом его скидки.
@theRusDerevnya
5 жыл бұрын
В топ!
@ruslanfilyk2904
5 жыл бұрын
Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.
@simplewebdev1098
5 жыл бұрын
@@ruslanfilyk2904 в целом норм.
@user-wl7ub4rj6m2 жыл бұрын
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'))
@MHM-hc8or5 жыл бұрын
👍
@tommygun79134 жыл бұрын
зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение? 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'));
@dimanarizhnyi3915 жыл бұрын
Тоже изучаю JS, но мне кажется есть еще один недочет. Если попросят проверить является ли строка палиндромом, то строка может содержать пробелы. Скажем, если передать в str "а роза упала на лапу азора" (что в тоже явялется строкой), такой вариант не сработает. То есть к минусам данного метода, я бы еще добавил "работает только для слов". Ведь задание "является ли строка", а не является ли "слово". Тут нужно быть внимательным к деталям.
@user-tp5sw9qx2m
5 жыл бұрын
тогда скорее всего нужно избавится для начала от пробелов через replace, а потом все как в видео, конечно если просят вывести только true / false.
@3dzbot
5 жыл бұрын
palindrom('ab ba ab ba') сработало. пробелы не проблема
@dimanarizhnyi391
5 жыл бұрын
@@3dzbotне самый лучший пример, сейчас я вам его сломаю. Проверьте "abb aab ba", что как бы тоже палиндром. Учитывайте индексы элементов строки.
@3dzbot
5 жыл бұрын
@@dimanarizhnyi391 -> str = str.toLowerCase().replace(/\s/g, ''); где со сменой регистра так же добавляем рег.выражение .replace(/\s/g, '') которое убирает пробелы со строки. "а роза азора" решена :)
@dimanarizhnyi391
5 жыл бұрын
@@3dzbot да, но код явно отличается от того, что представлен в видео. Про это решение я тоже знаю.
@user-cv5ze9wz6e4 жыл бұрын
let string = "Abba" let ans = string => { string = string.toLowerCase(); for(let i=0;i
@Metalscream5 жыл бұрын
Какой то Олег получается
@stra1f5953 жыл бұрын
Думаю для первой задачи такой код выглядит лутше: const palindrom = string => {return (string.toLowerCase().split("").reverse().join("") == string.toLowerCase())? true : false;} console.log(palindrom("HHHhh")); // true
@TheOlius5 жыл бұрын
1. toLowerCase можно тоже в возврат =). 2. слово "abrba" тоже является полиндромом об этом ни слова 3. данная задача даже не на ДЖУНА (по сути задача решается как и звучит (если развернуть слово наоборот то они будут равны), то есть ДУМАТЬ не нужно). Правильнее сформулированная задача о которой ты говоришь будет звучать так - "Определить, можно ли по входящей строке ПОСТРОИТЬ слово полиндром? то есть "abba" , "aabb" и "abbar" должны вернуть true, само слово строить не нужно, нужно лишь определить возможность." и вот тут начинаются сложности, при входящей строке в миллион символов... попробуй найти самое БЫСТРОЕ решение (АЛГОРИТМ) с МИНИМУМОМ циклов. Именно эту задачу задают при собеседовании на ПРОГРАММИСТА, а не определить что слово полиндром изначально... Которое решается в одну строчку. 4. Лайк если хочешь знать решение реальной задачи
@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
5 жыл бұрын
Отличная задача. Я так понимаю, что нужно сначала проверить длину строки, потом проверить символы на парность. Если длина непарная - допустима одна непарная буква, если парная - все буквы должны быть в четном количестве? Ответ не смотрел, так неспортивно =Р
@MrRagday
5 жыл бұрын
Андрей Галкин посмотрел твое решение... подумал... Понял, что достаточно просто проверить буквы на парность. Если останется одна непарная или ноль - годно. Нет - нет ;)
@MrRagday
5 жыл бұрын
Кстати, вместо хешМеп-массива с прогонами индексОф-ом, можно сделать объект, а цикл проверяет есть ли свойство с именем, совпадающим с текущей буквой. если есть - удаляет его и идет к следующей букве, если нет - создает и идет к следующей букве. Задача *гораздо* лучше чем в видео! Спасибо еще раз!
@user-or1hy4xz8u
2 жыл бұрын
@@TheOlius решальщик, пробелы и регистр у тебя учтены?
@user-sn1tz8wn5l5 жыл бұрын
мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют + если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит. получается надо убирать еще и пунктуационные знаки. нюансов много
@MrRagday
5 жыл бұрын
Сказано же, что мешают эмодзи. Автор думает про действительно тонкие вещи, а вы с пробелами и пунктуационными знаками лезете =Р
str = 'abba'.split('') let s = str.length for(let i = 0; i if(str[i] !== str[s - i - 1]){ console.log('Not a palindrom') return 0 } } console.log('It is a palindrom')
Если я передам число 101, ваш код сломается. Так как метода toLowerCase у Number нет. Можно переписать еще безопаснее и в одну строку, переписав название метода на isPalindrom (правило именования по возвращаемому типу переменной) const isPalindrom = str => str == String(str).toLowerCase().split('').reverse().join('') Плюсы моего решения: 1) Строка 2) Безопасно работает со всеми типами, за счет наличия String (работает с массивами, объектами и тд и тп)
@neonchik6768
4 жыл бұрын
Вроде написано что строку передают
@Mousehunter095 жыл бұрын
А это популярные задачи на джуниорскую должность или в принципе? Вряд ли же на должность Senior разработчика просят решить палиндром.
@user-yb3vy2wx8u
5 жыл бұрын
от собеседующих во многом зависит... сам недавно по собеседованиям бегал на сеньера, и встречал разное, от банальных задачек из гугла, которые старше 5 лет (это при том, что в резюме у меня указан опыт проведения тех. собеседований), до вполне адекватных уровню "заревьювь код джуна", "построй архитектуру системы" ну или алгоритмические по типу "найди кратчайший путь во взвешенном графе". сам никогда не даю типовые задачи, только авторские, обязательно проверю понимание промисов, а так же умение загуглить/поискать на mdn
@Mousehunter09
5 жыл бұрын
@@user-yb3vy2wx8u понятно, спасибо. А от джуна тоже требуете/ожидаете хорошее понимание промисов?
@user-lc2gd3nm9s3 жыл бұрын
Получается Олег
@sergekim54995 жыл бұрын
Можно докапаюсь?) Я бы написал строгое сравнение, чтоб в случае проблем с типами, там можно было отловить ошибку)
@user-sn1tz8wn5l
5 жыл бұрын
проблем с типами?)) приведите пример) любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)
@sergekim5499
5 жыл бұрын
@@user-sn1tz8wn5l ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая
@agentsmith9708
5 жыл бұрын
да, лучше сразу привыкать
@user-pq7dj1ny4h5 жыл бұрын
Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только ES6 синтаксис. Можете записать видео с решением?
@user-sn1tz8wn5l
5 жыл бұрын
а в чем проблема?) вот, держите) написано на коленке за 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
5 жыл бұрын
@@user-sn1tz8wn5l Стрелочные методы идут с ES6 и выше, а не только начиная с ES7. А так да. Спасибо!
@user-sn1tz8wn5l
5 жыл бұрын
@@user-pq7dj1ny4h стрелочные функции в ES6 появились, стрелочные методы в es7 метод - это функция экземпляра класса
@MrRagday
5 жыл бұрын
На какую позицию собеседование?
@user-pq7dj1ny4h
5 жыл бұрын
@@MrRagday junior front-end
@prsion19255 жыл бұрын
сделайте Пожалуйста видео как настраивать гугл карты подробно
@itgid
5 жыл бұрын
Есть в курсе html.itgid.info
@jorgenUA
5 жыл бұрын
www.w3schools.com/graphics/google_maps_intro.asp ... куда уж подробнее )
@bloodrik5 жыл бұрын
Я сам по себе с++ разработчик, js знаю только ради того чтобы знать. Можете пожалуйста объяснить, чем ваш метод решения лучше чем обычное формирование строки (создаём новую строку и в цикле по 1 символу с конца к ней добавляем). Я не буду умничать или ещё что-то, ибо сам понимаю, что в вебе я не так уж и хорош, но если объективно смотреть со стороны, то ваше решение уступает в 3 раза по производительности. У вас в решении 3 перебора, соответственно это уже str.length*3 итераций, когда в решении формирования это просто str.length операций. Не знаю решает ли это проблему с эмодзи, но производительность явно выше, особенно если брать огромные строки. Объясните выбор именно этого решения, мне интересно почему, может я чего-то не понимаю?
@bloodrik
5 жыл бұрын
Мне кажется на собеседовании должны брать именно оптимальные решения, а не легко-читаемые.
@itgid
5 жыл бұрын
Все очень просто - мы можем сравнить и точно ответить. Скидывайте ваш метод решения.
@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
5 жыл бұрын
как с++ разработчик ты должен знать, что определения полиндрома может работать за str.length/2. + не используя лишнюю память в виде нового стринга, который ты создал
@bloodrik
5 жыл бұрын
@@baigarinovalibek4612 я же не делал проверку на палиндром дефолтным способом, я показал автору его же алгоритм только в 3 раза быстрее. А алгоритм это конкретно ревёрс строки с последующим сравнением с исходной строкой.
@yugetio5 жыл бұрын
как лучше делать? И какая разница между spread оператором и простым методом split в данном случае? 1. [...str].reverse().join() 2. str.split('').reverse().join()
@Marolafighter
5 жыл бұрын
конкретно в данном случае никакой, а так split() более гибкий, ты можешь пихать в него аргументы, которые будут определять как именно сплитить данные, но он медленнее чем spread, так что все зависит от контекста в котором ты пременяешь эти методы
@ale0x314
5 жыл бұрын
@@Marolafighter split быстрее спреда.
@Marolafighter
5 жыл бұрын
@@ale0x314 хз, проверил в консоли, и спред быстрее
@MrRagday
5 жыл бұрын
Сплитом проще убрать пробелы и пунктуационные знаки.
@evilishant93365 жыл бұрын
бле капец, мы эти задачи ща проходим на первом курсе блен...
@TalkerTube
3 жыл бұрын
@Из жизни изгоя/ Школьный Блог. судя по лексикону - детский сад
@transfer65575 жыл бұрын
ну да, первая мысля показать 5 задач за 10 мин.? будет ли продолжение? и когда?
@MrRagday
5 жыл бұрын
Тебе тоже не хватило одного некорректного решения и нужно еще четыре?
Пікірлер: 396
Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !
Спасибо за решение задачи. Все по полочкам split.разложено, join.разжевано и в String положено :)
Полностью поддерживаю Roman! Объясняет, раскладывая все по полочкам! Прохожу курс, очень довольна!
Спасибо братка, крепкого тебе здоровья!
@itgid
5 жыл бұрын
Спасибо!
Очень интересно! Ждём новой части!
Классный канал. Я наконец понял работу с массивами.
@itgid
5 жыл бұрын
Супер!
Просто лучший в мире за работой.
понравилось, тока могли бы разделить по частям уроки а то люди будут думать что в этом видео все 5 задач
@itgid
5 жыл бұрын
Ок. Добавлю части!
@AwesomeMrUser
4 жыл бұрын
ЛаверКейс ;)
@user-gl8qs7qj4k
2 жыл бұрын
@@itgid не добавили....
@coldym
2 жыл бұрын
@@itgid все еще не добавили...
@user-qi7jq9so8g
2 жыл бұрын
@@itgid все еще не добавили....
Класс, продолжай, как раз буду устраиваться js js se
Алекс очень поступков и полезно спасибо!
Канал пушка!
@itgid
5 жыл бұрын
Ага, спасибо!
Отличное объяснение!!!!!!Спасибо!!
Как обычно топчик)
@itgid
5 жыл бұрын
Спасибо!
Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true. Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.
Круто, спасибо!
очень понятно объясняте, спасибо
Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!
Отличное видео! 👍
@itgid
5 жыл бұрын
Спасибо!
очень хорошая и простая задача. особенно решение. лайк
Классно)) мне понравилось такое решение))
@itgid
5 жыл бұрын
да, особенно прикольно от 3 операций к одной.
Этот палиндром мне теперь во сне как ужастик сниться будет 😅
Благодарю. И жду новых. Интересно.
@itgid
5 жыл бұрын
Да, завтра будут новые.
Очень круто объяснили спасибо! еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл
@itgid
5 жыл бұрын
да можно и самому, но обычно даже по такой маленькой задаче видно как и что.
супер, класно, велике дякую!
Скиньте видео с остальными 4 задачами? очень тяжеловато найти :(
Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.
@itgid
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) }
спасибо!
будет ли продолжение? а то написано 5 задач, а разобрали одну :)
На видео на 4:14 -->> let str2 = str.split(''); В 2019ом году для преобразования в массив проще писать let str2 = [...str1] Итераторы и деструктуризация во всей их красе :)
@user-il3xh5di2i
4 жыл бұрын
Да у автора проблемы с наименованием.
@apollon-8151
Жыл бұрын
то есть с помощью оператора spread можно из строки сделать массив? Надо будет попробовать на практике:) Спасибо за информацию
7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.
@sergei-sabitov
3 жыл бұрын
для того чтобы избежать мутирования можно использовать slice() или concat() перед самим ревёрсом, тогда получится новый массив, но т.к. мы нигде с исходным массивом не взаимодействуем, это лишний код который просто нагружает логику. Плюс декларативные конструкции(как в окончательном решении) читать и понимать намного легче чем то, что было в начале
Очень круто
После строки " str2 = str2.join; " "str2" необходимо преобразовать в строку, поскольку на данный момент это массив. Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ". А второй вариант работает некорректно и всегда выводит "true".
Спасибо;)
Можно ничего не делать с входной строкой. Имеет значение четное число символов или нет. Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1). Если строка не четная, то символ в середине можно не смотреть. Почитайте книгу "Cracking coding interview".
@senioreasy
5 жыл бұрын
Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.
@MrRagday
5 жыл бұрын
"Аргентина манит негра"
@simplewebdev1098
5 жыл бұрын
@@senioreasy верно, но только в JS 5/2 = 2.5. Нужно округлять, хотя, с другой стороны, не нужно. Ибо 3 всё равно > 2.5 так что для сравнения пойдёт.
@zhenshuang
4 жыл бұрын
Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.
@AwesomeMrUser
4 жыл бұрын
Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.
Спасибо
С латиницей всё понятно-все работает.А вот с кирилицей будет ли так же срабатывать,или нужно ещё чтото дополнительно?
Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи. Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, ""). Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".
В палиндроме, я бы все же сделал const reversedString = str.split('').reverse().join('') return string === reversedString Так будет на одну строчку больше, но сразу повышается читаемость кода.
@fuhait
Жыл бұрын
function palindrome(str) { return str.toLowerCase().split('').reverse().join('') == str; }
я же правильно понимаю, что если это все вдруг понадобится в синхронном выполнении (ну мало ли - запросы к серверу), то это все дело надо обернуть в async/await или промисами?
Все бы так код разбирали как вы:)
Я в JS полный ноль, но с точки зрения производительности это не очень хорошо. Гонять туда сюда стринг в массив и массив в стринг это лишние операции. Я думаю на собеседованиях больше обращают внимание на производительность кода, а не его краткость (может быть JS исключение?:) ). С таким же успехом, задание на сортировку массива можно решить готовым методом типа sort(), но в корне не понимать как эта самая сортировка работает. Может быть хотя бы так const is_polyndrom = str => { var n=str.length; str=str.toLowerCase(); for (let i=0;i
@artemkostylev2856
5 жыл бұрын
А если у вас не четное количество букв? Тогда n/2 будет не целым числом и проверка сломается
@user-yb3vy2wx8u
5 жыл бұрын
@@artemkostylev2856 ничего не сломается, при нечетной длине центральный символ не будет проверяться, что и не нужно для данной задачи
@artemkostylev2856
5 жыл бұрын
Дмитрий Беляев понятно, спасибо
@Warox42
5 жыл бұрын
Можно убрать ловер кейс, и делать ту ловер в иф конструкции для символов. Тогда на 1 проход будет меньше, что в данном случае являеться 50% сложности будет O(n) вместо O(2n)
@MrRagday
5 жыл бұрын
Всегда думал, что на собеседованиях ценится хорошо читаемый код, а не псевдообфусцированный.
спасибо
Лучший канал про Web
@itgid
5 жыл бұрын
Согласен!
@TheWorldPeace
5 жыл бұрын
Самокритично)
Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках. function palindrom(s){ s = s.toLowerCase(); s = s.split(''); var flag = true; for(let i = 0;i
@lexSkiller
5 жыл бұрын
Хороший пример
@user-yb3vy2wx8u
5 жыл бұрын
только достаточно так проверить половину строки, да и сплитить строку не нужно
@Warox42
5 жыл бұрын
Это не О(N) Ведь ту ловер кейс - полтный проход по строке потом сплит - полный проход по строке потом цикл. итого О(3n) А можно и правда за О(н)
@nightlair1215
5 жыл бұрын
Алгоритм проходит 3 раза, но в асимптотике не записываются коэффициенты O(n/100) = O(100n) = O(n)
@MrRagday
5 жыл бұрын
В чем смысл ускорять некорректный код?
Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п. Далее let count = Math.floor(arr.length/2); for (let i = 0; i if(arr[i] != arr[arr.length-i]) return false; } return true; Логика такова: если в массиве чётное количество элементов сравниваются попарно все. Если нечётное, средний элемент всё равно как-бы не влияет. Переменная count создана чтобы каждый цикл не вызывать Math.floor().
@MrRagday
5 жыл бұрын
Почему лет каунт, а не конст?
@simplewebdev1098
5 жыл бұрын
@@MrRagday да, const тут правильнее будет. Но не люблю я, почему то, этот const. Не нравится он мне, и всё ))
Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.
Еще есть такое решение: const func = str => { let string = str.toLowerCase().split('').reverse().join(''); let result = (string == str) ? true : false; return result } console.log(func('abbba'));
@r45her
3 жыл бұрын
return string === str
Как массив char рассмотреть строку вариант?
а какой у тебя опыт програмирования?
Спасибо за уроки! По поводу палиндромов - классический пример "А роза упала на лапу Азора", т.е. предложение с пробелами :) неплохо бы наверное было бы почистить строку от пробелов, или даже от всех небуквенных символов (прежде всего знаков припинания)
@user-dp6yt7yc9l
5 жыл бұрын
Все эти условия (эмодзи и прочее) зависит только от твоего представления палиндрома, лично я считаю что "А роза упала на лапу Азора" не является палиндромом.
@MrRagday
5 жыл бұрын
@@user-dp6yt7yc9l А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?
@user-dp6yt7yc9l
5 жыл бұрын
@@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.
@MrRagday
5 жыл бұрын
@@user-dp6yt7yc9l 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)
@user-dp6yt7yc9l
5 жыл бұрын
MrRagday в двоичной тоже, ну ну
Так вот где спец по js скрылся. Искал - не выходил нигде, а тут случайно наткнулся в рекомендациях. Однозначно подписка.
@MrRagday
5 жыл бұрын
Замечательного спеца нашли. Код которого не пройдет проверку первыми же примерами палиндромов из Википедии.
@zloy_tushkanchik
5 жыл бұрын
@@MrRagday можете посоветовать что то или кого то лучше?
@MrRagday
5 жыл бұрын
@@zloy_tushkanchik learn.javascript.ru Да тот же соракс на три головы выше этого "спеца"
А нового видоса нету или просто не найду?
Лайк за Олега )) olleh ))
Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить): переводим в нижний регистр, потом проходимся циклом for(var i = 0; i return true; Я бы хотел понять минусы (кроме смайлов) этих двух вариантов ,заранее Спасибо
@bloodrik
5 жыл бұрын
ваше решение является самым оптимальным, но на собеседованиях чаще хотят увидеть процесс именно ревёрса строки, в этом и цель. автор действительно показал не очень оптимальный вариант, ибо даже формирование новой строки по типу var res = ""; for(let j = str.length-1; j>=0;--j) { res+=str[j]; } является в 3 раза оптимальнее
@user-yb3vy2wx8u
5 жыл бұрын
@@bloodrik бежать надо с таких собеседований, где "хотят неоптимально", особенно если Вы понимаете это, особенно если Вы джун (опыта набраться у Вас в такой конторке не получится)
@MrRagday
5 жыл бұрын
Вариант с методами лучше читается. Для формошлепства это важнее, чем "оптимизации", которые изменяют загрузку с мгновенно на чуть быстрее чем мгновенно. А там, где оптимизация - это важно, скорее всего решение этой задачки будет совсем не самой большой головной болью на собеседовании.
@user-dp6yt7yc9l
5 жыл бұрын
Ты на интуиции программируешь? jsperf.com/palindrome/3
@simplewebdev1098
5 жыл бұрын
@@MrRagday я не собеседователь, но, как по мне, гораздо важнее, чтобы человек понимал как это работает, чем знал волшебные слова (reverse, split, join). Научить заклинаниям можно и обезьяну, толпы jqery програмыздов (которые не знают нативный JS) не дадут соврать.
Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.
@pavelharelyshau6106
11 ай бұрын
зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему
Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.
@anastasiafanina8760
2 жыл бұрын
в данном примере пробелы не учитываются
это на джуна, чет очень легко, я бы попросил что бы строку разбили на слова и вырезали из нее слова палиндромы, и потом еще про сложность спросил этого решения... может развернуть их порядок в предложении ) ... в принципе не намного сложнее а места для полёта фантазии уже больше, и решать и проверять интереснее... хотя возможно я на собесах давно не был )
Эх, решил задачу в 20 строк, совсем забыл про сплит и реверс, видимо еще учиться и учиться
так же есть вот такой варинат функции, которая определяет палиндром function isPalindrome(num) { let str = String(num), sum = 0; for (let i = 0; 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
5 жыл бұрын
Можно улучшить, сделав i
Как считаете? Если объединить код в return: return str = str.toLowerCase() && str == str.split('').reverse().join(''); // плохой ли это пример кода? (будут ли бить по рукам за это?)
@MrRagday
5 жыл бұрын
Это лучше чем никакого решения. Но не очень читабельно. Подумай сам: хочешь ли ты работать в конторе, в которой пишут нечитабельный код?
Имхо, я как собеседующий ожидал бы решение с 2мя циклами. Это реально показал бы умеет ли думать Джун или нет
function check (str) { let str2 = ""; for (let i = str.length - 1; i >= 0; i--){ str2 += str[i]; } console.log(str2 == str); } check ("ala");
@MrRagday
5 жыл бұрын
Не жадничай на знаки "="
а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого: const length = str.length for(let i = 0; i if (str[i] !== str[length - i - 1]) { return false } return true } return true ну это если уж совсем упарываться, если работа с малым количеством данных то и в одну строчку решение норм
@baigarinovalibek4612
5 жыл бұрын
можно добежать до середины строки, этого будет достаточно
@Marolafighter
5 жыл бұрын
@@baigarinovalibek4612 да, ты прав, всё-таки писать код в комментарии не очень удобно, пропустил этот момент
0) Где проверка входных данных? 1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае. 2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.
понравилось
let pal = (str) => { if (typeof str != 'string') return false; let tmp = []; for(let c of str) { tmp.unshift(c); } return tmp.join('') == str; } Не лучше ли вот так написать?
Я вот такое понаписывал: function palindrom() { let word = prompt("put a word").toLowerCase(); let backWords = word.split("").reverse().join(""); if (word == backWords) { return true; } else { return false; } }
Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом" На такой случай я знаю красивый алгоритм: // функция, которая разворачивает число по принципу чтения числа задом наперед 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
5 жыл бұрын
С помощью str = "" + num; задача сводится к исходной =Р
@ArthurYelkin
5 жыл бұрын
@@MrRagday а при чем тут str?
@MrRagday
5 жыл бұрын
@@ArthurYelkin Если со строкой просто, а для числа нужны отдельные алгоритмы, то не проще ли превратить число в строку и воспользоваться "простым" решением?
@ArthurYelkin
5 жыл бұрын
@@MrRagday ну кстати логично)
А имя функции не должно означать действие?
Решил только у вас в раз 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); }
На прямую никто не изменяет аргументы функции..
А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи function palindromeCheck(str: string) { let left = 1; const mid = Math.round(str.length - left / 2); const end = str.length - 1; while (left if (str[left - 1] != str[str.length- (left - 1)]) return false; left++; } return true; } Нормально будет ? Или громоздко?
лайк
Можно добавить метод trim()
Алекс! А можем рассмотреть такой пример - Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон) Из базы данных подтягивается информация и выводит цены с учетом его скидки.
@theRusDerevnya
5 жыл бұрын
В топ!
@ruslanfilyk2904
5 жыл бұрын
Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.
@simplewebdev1098
5 жыл бұрын
@@ruslanfilyk2904 в целом норм.
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'))
👍
зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение? 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'));
Тоже изучаю JS, но мне кажется есть еще один недочет. Если попросят проверить является ли строка палиндромом, то строка может содержать пробелы. Скажем, если передать в str "а роза упала на лапу азора" (что в тоже явялется строкой), такой вариант не сработает. То есть к минусам данного метода, я бы еще добавил "работает только для слов". Ведь задание "является ли строка", а не является ли "слово". Тут нужно быть внимательным к деталям.
@user-tp5sw9qx2m
5 жыл бұрын
тогда скорее всего нужно избавится для начала от пробелов через replace, а потом все как в видео, конечно если просят вывести только true / false.
@3dzbot
5 жыл бұрын
palindrom('ab ba ab ba') сработало. пробелы не проблема
@dimanarizhnyi391
5 жыл бұрын
@@3dzbotне самый лучший пример, сейчас я вам его сломаю. Проверьте "abb aab ba", что как бы тоже палиндром. Учитывайте индексы элементов строки.
@3dzbot
5 жыл бұрын
@@dimanarizhnyi391 -> str = str.toLowerCase().replace(/\s/g, ''); где со сменой регистра так же добавляем рег.выражение .replace(/\s/g, '') которое убирает пробелы со строки. "а роза азора" решена :)
@dimanarizhnyi391
5 жыл бұрын
@@3dzbot да, но код явно отличается от того, что представлен в видео. Про это решение я тоже знаю.
let string = "Abba" let ans = string => { string = string.toLowerCase(); for(let i=0;i
Какой то Олег получается
Думаю для первой задачи такой код выглядит лутше: const palindrom = string => {return (string.toLowerCase().split("").reverse().join("") == string.toLowerCase())? true : false;} console.log(palindrom("HHHhh")); // true
1. toLowerCase можно тоже в возврат =). 2. слово "abrba" тоже является полиндромом об этом ни слова 3. данная задача даже не на ДЖУНА (по сути задача решается как и звучит (если развернуть слово наоборот то они будут равны), то есть ДУМАТЬ не нужно). Правильнее сформулированная задача о которой ты говоришь будет звучать так - "Определить, можно ли по входящей строке ПОСТРОИТЬ слово полиндром? то есть "abba" , "aabb" и "abbar" должны вернуть true, само слово строить не нужно, нужно лишь определить возможность." и вот тут начинаются сложности, при входящей строке в миллион символов... попробуй найти самое БЫСТРОЕ решение (АЛГОРИТМ) с МИНИМУМОМ циклов. Именно эту задачу задают при собеседовании на ПРОГРАММИСТА, а не определить что слово полиндром изначально... Которое решается в одну строчку. 4. Лайк если хочешь знать решение реальной задачи
@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
5 жыл бұрын
Отличная задача. Я так понимаю, что нужно сначала проверить длину строки, потом проверить символы на парность. Если длина непарная - допустима одна непарная буква, если парная - все буквы должны быть в четном количестве? Ответ не смотрел, так неспортивно =Р
@MrRagday
5 жыл бұрын
Андрей Галкин посмотрел твое решение... подумал... Понял, что достаточно просто проверить буквы на парность. Если останется одна непарная или ноль - годно. Нет - нет ;)
@MrRagday
5 жыл бұрын
Кстати, вместо хешМеп-массива с прогонами индексОф-ом, можно сделать объект, а цикл проверяет есть ли свойство с именем, совпадающим с текущей буквой. если есть - удаляет его и идет к следующей букве, если нет - создает и идет к следующей букве. Задача *гораздо* лучше чем в видео! Спасибо еще раз!
@user-or1hy4xz8u
2 жыл бұрын
@@TheOlius решальщик, пробелы и регистр у тебя учтены?
мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют + если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит. получается надо убирать еще и пунктуационные знаки. нюансов много
@MrRagday
5 жыл бұрын
Сказано же, что мешают эмодзи. Автор думает про действительно тонкие вещи, а вы с пробелами и пунктуационными знаками лезете =Р
const palindrom = (str) => str === str.toLowerCase().split('').reverse().join('');
str = 'abba'.split('') let s = str.length for(let i = 0; i if(str[i] !== str[s - i - 1]){ console.log('Not a palindrom') return 0 } } console.log('It is a palindrom')
const isPalindrome = (str) => { for(let i = 0 ; i if(str[i] !== str[str.length-1-i]) { return false; } return true; } }
Собеседование? Нет, не слышал ... )
Если я передам число 101, ваш код сломается. Так как метода toLowerCase у Number нет. Можно переписать еще безопаснее и в одну строку, переписав название метода на isPalindrom (правило именования по возвращаемому типу переменной) const isPalindrom = str => str == String(str).toLowerCase().split('').reverse().join('') Плюсы моего решения: 1) Строка 2) Безопасно работает со всеми типами, за счет наличия String (работает с массивами, объектами и тд и тп)
@neonchik6768
4 жыл бұрын
Вроде написано что строку передают
А это популярные задачи на джуниорскую должность или в принципе? Вряд ли же на должность Senior разработчика просят решить палиндром.
@user-yb3vy2wx8u
5 жыл бұрын
от собеседующих во многом зависит... сам недавно по собеседованиям бегал на сеньера, и встречал разное, от банальных задачек из гугла, которые старше 5 лет (это при том, что в резюме у меня указан опыт проведения тех. собеседований), до вполне адекватных уровню "заревьювь код джуна", "построй архитектуру системы" ну или алгоритмические по типу "найди кратчайший путь во взвешенном графе". сам никогда не даю типовые задачи, только авторские, обязательно проверю понимание промисов, а так же умение загуглить/поискать на mdn
@Mousehunter09
5 жыл бұрын
@@user-yb3vy2wx8u понятно, спасибо. А от джуна тоже требуете/ожидаете хорошее понимание промисов?
Получается Олег
Можно докапаюсь?) Я бы написал строгое сравнение, чтоб в случае проблем с типами, там можно было отловить ошибку)
@user-sn1tz8wn5l
5 жыл бұрын
проблем с типами?)) приведите пример) любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)
@sergekim5499
5 жыл бұрын
@@user-sn1tz8wn5l ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая
@agentsmith9708
5 жыл бұрын
да, лучше сразу привыкать
Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только ES6 синтаксис. Можете записать видео с решением?
@user-sn1tz8wn5l
5 жыл бұрын
а в чем проблема?) вот, держите) написано на коленке за 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
5 жыл бұрын
@@user-sn1tz8wn5l Стрелочные методы идут с ES6 и выше, а не только начиная с ES7. А так да. Спасибо!
@user-sn1tz8wn5l
5 жыл бұрын
@@user-pq7dj1ny4h стрелочные функции в ES6 появились, стрелочные методы в es7 метод - это функция экземпляра класса
@MrRagday
5 жыл бұрын
На какую позицию собеседование?
@user-pq7dj1ny4h
5 жыл бұрын
@@MrRagday junior front-end
сделайте Пожалуйста видео как настраивать гугл карты подробно
@itgid
5 жыл бұрын
Есть в курсе html.itgid.info
@jorgenUA
5 жыл бұрын
www.w3schools.com/graphics/google_maps_intro.asp ... куда уж подробнее )
Я сам по себе с++ разработчик, js знаю только ради того чтобы знать. Можете пожалуйста объяснить, чем ваш метод решения лучше чем обычное формирование строки (создаём новую строку и в цикле по 1 символу с конца к ней добавляем). Я не буду умничать или ещё что-то, ибо сам понимаю, что в вебе я не так уж и хорош, но если объективно смотреть со стороны, то ваше решение уступает в 3 раза по производительности. У вас в решении 3 перебора, соответственно это уже str.length*3 итераций, когда в решении формирования это просто str.length операций. Не знаю решает ли это проблему с эмодзи, но производительность явно выше, особенно если брать огромные строки. Объясните выбор именно этого решения, мне интересно почему, может я чего-то не понимаю?
@bloodrik
5 жыл бұрын
Мне кажется на собеседовании должны брать именно оптимальные решения, а не легко-читаемые.
@itgid
5 жыл бұрын
Все очень просто - мы можем сравнить и точно ответить. Скидывайте ваш метод решения.
@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
5 жыл бұрын
как с++ разработчик ты должен знать, что определения полиндрома может работать за str.length/2. + не используя лишнюю память в виде нового стринга, который ты создал
@bloodrik
5 жыл бұрын
@@baigarinovalibek4612 я же не делал проверку на палиндром дефолтным способом, я показал автору его же алгоритм только в 3 раза быстрее. А алгоритм это конкретно ревёрс строки с последующим сравнением с исходной строкой.
как лучше делать? И какая разница между spread оператором и простым методом split в данном случае? 1. [...str].reverse().join() 2. str.split('').reverse().join()
@Marolafighter
5 жыл бұрын
конкретно в данном случае никакой, а так split() более гибкий, ты можешь пихать в него аргументы, которые будут определять как именно сплитить данные, но он медленнее чем spread, так что все зависит от контекста в котором ты пременяешь эти методы
@ale0x314
5 жыл бұрын
@@Marolafighter split быстрее спреда.
@Marolafighter
5 жыл бұрын
@@ale0x314 хз, проверил в консоли, и спред быстрее
@MrRagday
5 жыл бұрын
Сплитом проще убрать пробелы и пунктуационные знаки.
бле капец, мы эти задачи ща проходим на первом курсе блен...
@TalkerTube
3 жыл бұрын
@Из жизни изгоя/ Школьный Блог. судя по лексикону - детский сад
ну да, первая мысля показать 5 задач за 10 мин.? будет ли продолжение? и когда?
@MrRagday
5 жыл бұрын
Тебе тоже не хватило одного некорректного решения и нужно еще четыре?