Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !
Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках. function palindrom(s){ s = s.toLowerCase(); s = s.split(''); var flag = true; for(let i = 0;i
Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п. Далее 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().
Можно ничего не делать с входной строкой. Имеет значение четное число символов или нет. Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1). Если строка не четная, то символ в середине можно не смотреть. Почитайте книгу "Cracking coding interview".
Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.
Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.
Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.
Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true. Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.
На видео на 4:14 -->> let str2 = str.split(''); В 2019ом году для преобразования в массив проще писать let str2 = [...str1] Итераторы и деструктуризация во всей их красе :)
В палиндроме, я бы все же сделал const reversedString = str.split('').reverse().join('') return string === reversedString Так будет на одну строчку больше, но сразу повышается читаемость кода.
Я в JS полный ноль, но с точки зрения производительности это не очень хорошо. Гонять туда сюда стринг в массив и массив в стринг это лишние операции. Я думаю на собеседованиях больше обращают внимание на производительность кода, а не его краткость (может быть JS исключение?:) ). С таким же успехом, задание на сортировку массива можно решить готовым методом типа sort(), но в корне не понимать как эта самая сортировка работает. Может быть хотя бы так const is_polyndrom = str => { var n=str.length; str=str.toLowerCase(); for (let i=0;i
Можно убрать ловер кейс, и делать ту ловер в иф конструкции для символов. Тогда на 1 проход будет меньше, что в данном случае являеться 50% сложности будет O(n) вместо O(2n)
Еще есть такое решение: const func = str => { let string = str.toLowerCase().split('').reverse().join(''); let result = (string == str) ? true : false; return result } console.log(func('abbba'));
написал за 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) }
7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.
для того чтобы избежать мутирования можно использовать slice() или concat() перед самим ревёрсом, тогда получится новый массив, но т.к. мы нигде с исходным массивом не взаимодействуем, это лишний код который просто нагружает логику. Плюс декларативные конструкции(как в окончательном решении) читать и понимать намного легче чем то, что было в начале
Спасибо за уроки! По поводу палиндромов - классический пример "А роза упала на лапу Азора", т.е. предложение с пробелами :) неплохо бы наверное было бы почистить строку от пробелов, или даже от всех небуквенных символов (прежде всего знаков припинания)
Все эти условия (эмодзи и прочее) зависит только от твоего представления палиндрома, лично я считаю что "А роза упала на лапу Азора" не является палиндромом.
@@МихаилВикторович-р2я А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?
@@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.
@@МихаилВикторович-р2я 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)
так же есть вот такой варинат функции, которая определяет палиндром 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; }
Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом" На такой случай я знаю красивый алгоритм: // функция, которая разворачивает число по принципу чтения числа задом наперед 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
@@ArthurYelkin Если со строкой просто, а для числа нужны отдельные алгоритмы, то не проще ли превратить число в строку и воспользоваться "простым" решением?
а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого: 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 ну это если уж совсем упарываться, если работа с малым количеством данных то и в одну строчку решение норм
Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить): переводим в нижний регистр, потом проходимся циклом for(var i = 0; i < str.length/2; i++) if(str[i] != str[str.length - i - 1]) return false; return true; Я бы хотел понять минусы (кроме смайлов) этих двух вариантов ,заранее Спасибо
ваше решение является самым оптимальным, но на собеседованиях чаще хотят увидеть процесс именно ревёрса строки, в этом и цель. автор действительно показал не очень оптимальный вариант, ибо даже формирование новой строки по типу var res = ""; for(let j = str.length-1; j>=0;--j) { res+=str[j]; } является в 3 раза оптимальнее
@@bloodrik бежать надо с таких собеседований, где "хотят неоптимально", особенно если Вы понимаете это, особенно если Вы джун (опыта набраться у Вас в такой конторке не получится)
Вариант с методами лучше читается. Для формошлепства это важнее, чем "оптимизации", которые изменяют загрузку с мгновенно на чуть быстрее чем мгновенно. А там, где оптимизация - это важно, скорее всего решение этой задачки будет совсем не самой большой головной болью на собеседовании.
@@MrRagday я не собеседователь, но, как по мне, гораздо важнее, чтобы человек понимал как это работает, чем знал волшебные слова (reverse, split, join). Научить заклинаниям можно и обезьяну, толпы jqery програмыздов (которые не знают нативный JS) не дадут соврать.
Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.
Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.
Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!
let pal = (str) => { if (typeof str != 'string') return false; let tmp = []; for(let c of str) { tmp.unshift(c); } return tmp.join('') == str; } Не лучше ли вот так написать?
Тоже изучаю JS, но мне кажется есть еще один недочет. Если попросят проверить является ли строка палиндромом, то строка может содержать пробелы. Скажем, если передать в str "а роза упала на лапу азора" (что в тоже явялется строкой), такой вариант не сработает. То есть к минусам данного метода, я бы еще добавил "работает только для слов". Ведь задание "является ли строка", а не является ли "слово". Тут нужно быть внимательным к деталям.
@@dimanarizhnyi391 -> str = str.toLowerCase().replace(/\s/g, ''); где со сменой регистра так же добавляем рег.выражение .replace(/\s/g, '') которое убирает пробелы со строки. "а роза азора" решена :)
@user-nd4sl1lp9b, UTF-16 работает через обычный индекс массива, или прямо строки. Если массив создан из строки через итератор (например ...) тогда и любые композитные символы, типа, эмодзи, работают. См. моё решение.
Если я передам число 101, ваш код сломается. Так как метода toLowerCase у Number нет. Можно переписать еще безопаснее и в одну строку, переписав название метода на isPalindrom (правило именования по возвращаемому типу переменной) const isPalindrom = str => str == String(str).toLowerCase().split('').reverse().join('') Плюсы моего решения: 1) Строка 2) Безопасно работает со всеми типами, за счет наличия String (работает с массивами, объектами и тд и тп)
1. toLowerCase можно тоже в возврат =). 2. слово "abrba" тоже является полиндромом об этом ни слова 3. данная задача даже не на ДЖУНА (по сути задача решается как и звучит (если развернуть слово наоборот то они будут равны), то есть ДУМАТЬ не нужно). Правильнее сформулированная задача о которой ты говоришь будет звучать так - "Определить, можно ли по входящей строке ПОСТРОИТЬ слово полиндром? то есть "abba" , "aabb" и "abbar" должны вернуть true, само слово строить не нужно, нужно лишь определить возможность." и вот тут начинаются сложности, при входящей строке в миллион символов... попробуй найти самое БЫСТРОЕ решение (АЛГОРИТМ) с МИНИМУМОМ циклов. Именно эту задачу задают при собеседовании на ПРОГРАММИСТА, а не определить что слово полиндром изначально... Которое решается в одну строчку. 4. Лайк если хочешь знать решение реальной задачи
в общем решил забить - правильный ответ: 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); }
Отличная задача. Я так понимаю, что нужно сначала проверить длину строки, потом проверить символы на парность. Если длина непарная - допустима одна непарная буква, если парная - все буквы должны быть в четном количестве? Ответ не смотрел, так неспортивно =Р
Андрей Галкин посмотрел твое решение... подумал... Понял, что достаточно просто проверить буквы на парность. Если останется одна непарная или ноль - годно. Нет - нет ;)
Кстати, вместо хешМеп-массива с прогонами индексОф-ом, можно сделать объект, а цикл проверяет есть ли свойство с именем, совпадающим с текущей буквой. если есть - удаляет его и идет к следующей букве, если нет - создает и идет к следующей букве. Задача *гораздо* лучше чем в видео! Спасибо еще раз!
Очень круто объяснили спасибо! еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл
0) Где проверка входных данных? 1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае. 2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.
Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи. Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, ""). Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".
Думаю для первой задачи такой код выглядит лутше: const palindrom = string => {return (string.toLowerCase().split("").reverse().join("") == string.toLowerCase())? true : false;} console.log(palindrom("HHHhh")); // true
После строки " str2 = str2.join; " "str2" необходимо преобразовать в строку, поскольку на данный момент это массив. Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ". А второй вариант работает некорректно и всегда выводит "true".
Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только ES6 синтаксис. Можете записать видео с решением?
Как считаете? Если объединить код в return: return str = str.toLowerCase() && str == str.split('').reverse().join(''); // плохой ли это пример кода? (будут ли бить по рукам за это?)
А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи 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; } Нормально будет ? Или громоздко?
Алекс! А можем рассмотреть такой пример - Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон) Из базы данных подтягивается информация и выводит цены с учетом его скидки.
Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.
Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.
зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему
Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.
это на джуна, чет очень легко, я бы попросил что бы строку разбили на слова и вырезали из нее слова палиндромы, и потом еще про сложность спросил этого решения... может развернуть их порядок в предложении ) ... в принципе не намного сложнее а места для полёта фантазии уже больше, и решать и проверять интереснее... хотя возможно я на собесах давно не был )
зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение? 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'));
Я вот такое понаписывал: function palindrom() { let word = prompt("put a word").toLowerCase(); let backWords = word.split("").reverse().join(""); if (word == backWords) { return true; } else { return false; } }
str = 'abba'.split('') let s = str.length for(let i = 0; i < s; i++){ if(str[i] !== str[s - i - 1]){ console.log('Not a palindrom') return 0 } } console.log('It is a palindrom')
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'))
я же правильно понимаю, что если это все вдруг понадобится в синхронном выполнении (ну мало ли - запросы к серверу), то это все дело надо обернуть в async/await или промисами?
как лучше делать? И какая разница между spread оператором и простым методом split в данном случае? 1. [...str].reverse().join() 2. str.split('').reverse().join()
конкретно в данном случае никакой, а так split() более гибкий, ты можешь пихать в него аргументы, которые будут определять как именно сплитить данные, но он медленнее чем spread, так что все зависит от контекста в котором ты пременяешь эти методы
Есть способ решить задачу быстрее. Переводим строку в в список и итерируемся по индексам от 0 до середины и от конца до середины.Если элементы списка, взятые по данной паре индексов не совпадают, то сразу возвращаем false. Решение показывает не сколько знание языка, сколько понимание алгоритмов.
@@MrRagday Или правильный? Пробел это такой же юникодный символ, как и все остальные. Если в задаче не было условия отбрасывать пробелы, то ваша фраза палиндромом не является.
@@TonyFlexPromo Ну, перед решением задачи "Сделать проверку на палиндром" было бы неплохо узнать _что_ такое палиндром и какие они бывают, а не бежать кодить.
@@TonyFlexPromo Алгоритм, который для проверки палиндромов, который некорректно работает с популярнейшими палиндромами - негодный алгоритм. Его можно сделать очень-очень быстрым, но от этого он все равно не станет проходить корректные тесты.
проблем с типами?)) приведите пример) любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)
@@данилкононов-э3в ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая
мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют + если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит. получается надо убирать еще и пунктуационные знаки. нюансов много
Мне конечно очень интересно, но такие задачи по-видимо только логику улучшают ? На практике дела обстоят намного хуже ? Те же задачи про ООП на собеседовании никто не спрашивает, а если примут и человек не сможет выполнить реальную задачу ?
ООП никто не спрашивает у js разрабов, потому что в нем нет ООП. соответственно ООП шаблоны проектирования не применимы. Ну главное наверно все таки чтобы логически человек мог представить, как что то должно работать
@@grantruss5238Чтобы не было недопонимания в JS объекты и "классы" работают не так как в классическом ООП. По сути конструктор это просто функция возвращающая this. Что касается классов объявляя класс через относительно недавнюю фитчу class Name{} на самом вы объявляете функцию Name и добавляете на объект prototype методы это все не особо вяжется с классическим ООП. Хотя я понял наверно про что вы, когда говорили о практике. разрабу нужно понимать именно как работает js в нем очень много подводных камней один this и зоны видимости не мало нервных клеток убили наверно)) это довольно тяжело объяснить в рамках таких видео, ну и это не базовые вещи. Если вам интересно и есть какие то базовые знания в языке, можете найти серию книг "You Don't Know JS" (Кайл Симпсон) там довольно интересно и понятно все написано, по поводу объектов это "this & Object Prototypes"
ребята помогите решить пожалуйста На вход подается фраза на русском языке, содержащая числительное. Например, "Я хочу квартиру за 10.5 миллионов" или "Мне нравится когда моя машина, стоимостью сотку штук баксов, мелькает по телевизору". Необходимо выделить числительное в форме натурального числа и вернуть.
от собеседующих во многом зависит... сам недавно по собеседованиям бегал на сеньера, и встречал разное, от банальных задачек из гугла, которые старше 5 лет (это при том, что в резюме у меня указан опыт проведения тех. собеседований), до вполне адекватных уровню "заревьювь код джуна", "построй архитектуру системы" ну или алгоритмические по типу "найди кратчайший путь во взвешенном графе". сам никогда не даю типовые задачи, только авторские, обязательно проверю понимание промисов, а так же умение загуглить/поискать на mdn
Я сам по себе с++ разработчик, js знаю только ради того чтобы знать. Можете пожалуйста объяснить, чем ваш метод решения лучше чем обычное формирование строки (создаём новую строку и в цикле по 1 символу с конца к ней добавляем). Я не буду умничать или ещё что-то, ибо сам понимаю, что в вебе я не так уж и хорош, но если объективно смотреть со стороны, то ваше решение уступает в 3 раза по производительности. У вас в решении 3 перебора, соответственно это уже str.length*3 итераций, когда в решении формирования это просто str.length операций. Не знаю решает ли это проблему с эмодзи, но производительность явно выше, особенно если брать огромные строки. Объясните выбор именно этого решения, мне интересно почему, может я чего-то не понимаю?
как с++ разработчик ты должен знать, что определения полиндрома может работать за str.length/2. + не используя лишнюю память в виде нового стринга, который ты создал
@@da_costa-h7t я же не делал проверку на палиндром дефолтным способом, я показал автору его же алгоритм только в 3 раза быстрее. А алгоритм это конкретно ревёрс строки с последующим сравнением с исходной строкой.
решил по своему function palindrom(str) { str.toLowerCase(); let validatePal = [...str].reverse().join(''); if(str === validatePal) return true; else return false; }
Такая функция раз в 8 быстрее: function isPalindrom(str) { str = str.toLowerCase(); return str === str.split('').reverse().join(''); } function isPalindrom2(str) { var strLength = str.length; str = str.toLowerCase();
for (var i = 0; i < strLength/2; i++) { if (str[i] !== str[strLength - i - 1]) { return false; } }
В 8 раз? У меня на FF 58.0.2 (32-біт) такие результаты: isPalindrom, строка "hello": 1165.22мс isPalindrom, строка "abba": 1061.0600000000002мс isPalindrom2, строка "hello": 19.11999999999989мс isPalindrom2, строка "abba": 31.240000000000236мс Кстати, после var time = performance.now() не хватает ; Но этот тест не полный, нужно взять строку подлиннее (допилил код, чтобы результат выводил, палиндром или нет): isPalindrom, строка "hello world, i`am best JS developer ewer!": 3837.4мс false isPalindrom, строка "abcdefghijklmnopqrstuutsrqponmlkjihgfedcba": 3959.18мс true isPalindrom2, строка "hello world, i`am best JS developer ewer!": 19.859999999999673мс false isPalindrom2, строка "abcdefghijklmnopqrstuutsrqponmlkjihgfedcba": 317.8199999999997мс true Как видим, если строка длинее, то всё ещё хуже. Особенно, если исходная строка не палиндром, второй код отваливается гораздо быстрее, в данном случае на первом же симовле.
@@simplewebdev1098 У меня на опере, хроме и ff результаты примерно такие: isPalindrom, строка "hello": 283.04500004742295мс isPalindrom, строка "abba": 251.47000001743436мс isPalindrom2, строка "hello": 28.61999999731779мс isPalindrom2, строка "abba": 36.019999999552965мс
понравилось, тока могли бы разделить по частям уроки а то люди будут думать что в этом видео все 5 задач
Ок. Добавлю части!
ЛаверКейс ;)
@@itgid не добавили....
@@itgid все еще не добавили...
@@itgid все еще не добавили....
Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !
Спасибо за решение задачи. Все по полочкам split.разложено, join.разжевано и в String положено :)
Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках.
function palindrom(s){
s = s.toLowerCase();
s = s.split('');
var flag = true;
for(let i = 0;i
Хороший пример
только достаточно так проверить половину строки, да и сплитить строку не нужно
Это не О(N)
Ведь ту ловер кейс - полтный проход по строке
потом сплит - полный проход по строке
потом цикл. итого О(3n)
А можно и правда за О(н)
Алгоритм проходит 3 раза, но в асимптотике не записываются коэффициенты O(n/100) = O(100n) = O(n)
В чем смысл ускорять некорректный код?
Спасибо братка, крепкого тебе здоровья!
Спасибо!
Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п.
Далее
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 да, const тут правильнее будет. Но не люблю я, почему то, этот const. Не нравится он мне, и всё ))
Можно ничего не делать с входной строкой.
Имеет значение четное число символов или нет.
Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1).
Если строка не четная, то символ в середине можно не смотреть.
Почитайте книгу "Cracking coding interview".
Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.
"Аргентина манит негра"
@@senioreasy верно, но только в JS 5/2 = 2.5. Нужно округлять, хотя, с другой стороны, не нужно. Ибо 3 всё равно > 2.5 так что для сравнения пойдёт.
Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.
Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.
Скиньте видео с остальными 4 задачами? очень тяжеловато найти :(
Полностью поддерживаю Roman! Объясняет, раскладывая все по полочкам! Прохожу курс, очень довольна!
Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true.
Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.
Канал пушка!
Ага, спасибо!
Классный канал. Я наконец понял работу с массивами.
Супер!
На видео на 4:14 -->> let str2 = str.split('');
В 2019ом году для преобразования в массив проще писать let str2 = [...str1]
Итераторы и деструктуризация во всей их красе :)
Да у автора проблемы с наименованием.
то есть с помощью оператора spread можно из строки сделать массив? Надо будет попробовать на практике:)
Спасибо за информацию
Этот палиндром мне теперь во сне как ужастик сниться будет 😅
Лучший канал про Web
Согласен!
Самокритично)
В палиндроме, я бы все же сделал
const reversedString = str.split('').reverse().join('')
return string === reversedString
Так будет на одну строчку больше, но сразу повышается читаемость кода.
function palindrome(str) {
return str.toLowerCase().split('').reverse().join('') == str;
}
Я в JS полный ноль, но с точки зрения производительности это не очень хорошо. Гонять туда сюда стринг в массив и массив в стринг это лишние операции. Я думаю на собеседованиях больше обращают внимание на производительность кода, а не его краткость (может быть JS исключение?:) ). С таким же успехом, задание на сортировку массива можно решить готовым методом типа sort(), но в корне не понимать как эта самая сортировка работает. Может быть хотя бы так
const is_polyndrom = str => {
var n=str.length;
str=str.toLowerCase();
for (let i=0;i
А если у вас не четное количество букв? Тогда n/2 будет не целым числом и проверка сломается
@@artemkostylev2856 ничего не сломается, при нечетной длине центральный символ не будет проверяться, что и не нужно для данной задачи
Дмитрий Беляев понятно, спасибо
Можно убрать ловер кейс, и делать ту ловер в иф конструкции для символов. Тогда на 1 проход будет меньше, что в данном случае являеться 50% сложности
будет O(n) вместо O(2n)
Всегда думал, что на собеседованиях ценится хорошо читаемый код, а не псевдообфусцированный.
Еще есть такое решение:
const func = str => {
let string = str.toLowerCase().split('').reverse().join('');
let result = (string == str) ? true : false;
return result
}
console.log(func('abbba'));
return string === str
Просто лучший в мире за работой.
написал за 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)
}
7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.
для того чтобы избежать мутирования можно использовать slice() или concat() перед самим ревёрсом, тогда получится новый массив, но т.к. мы нигде с исходным массивом не взаимодействуем, это лишний код который просто нагружает логику.
Плюс декларативные конструкции(как в окончательном решении) читать и понимать намного легче чем то, что было в начале
Спасибо за уроки!
По поводу палиндромов - классический пример "А роза упала на лапу Азора", т.е. предложение с пробелами :) неплохо бы наверное было бы почистить строку от пробелов, или даже от всех небуквенных символов (прежде всего знаков припинания)
Все эти условия (эмодзи и прочее) зависит только от твоего представления палиндрома, лично я считаю что "А роза упала на лапу Азора" не является палиндромом.
@@МихаилВикторович-р2я А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?
@@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.
@@МихаилВикторович-р2я 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)
MrRagday в двоичной тоже, ну ну
так же есть вот такой варинат функции, которая определяет палиндром
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;
}
Можно улучшить, сделав i
Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом"
На такой случай я знаю красивый алгоритм:
// функция, которая разворачивает число по принципу чтения числа задом наперед
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
С помощью str = "" + num; задача сводится к исходной =Р
@@MrRagday а при чем тут str?
@@ArthurYelkin Если со строкой просто, а для числа нужны отдельные алгоритмы, то не проще ли превратить число в строку и воспользоваться "простым" решением?
@@MrRagday ну кстати логично)
Как обычно топчик)
Спасибо!
Класс, продолжай, как раз буду устраиваться js js se
а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого:
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
ну это если уж совсем упарываться, если работа с малым количеством данных то и в одну строчку решение норм
можно добежать до середины строки, этого будет достаточно
@@da_costa-h7t да, ты прав, всё-таки писать код в комментарии не очень удобно, пропустил этот момент
Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить):
переводим в нижний регистр, потом проходимся циклом for(var i = 0; i < str.length/2; i++) if(str[i] != str[str.length - i - 1]) return false;
return true;
Я бы хотел понять минусы (кроме смайлов) этих двух вариантов ,заранее Спасибо
ваше решение является самым оптимальным, но на собеседованиях чаще хотят увидеть процесс именно ревёрса строки, в этом и цель.
автор действительно показал не очень оптимальный вариант, ибо даже формирование новой строки по типу
var res = "";
for(let j = str.length-1; j>=0;--j)
{
res+=str[j];
}
является в 3 раза оптимальнее
@@bloodrik бежать надо с таких собеседований, где "хотят неоптимально", особенно если Вы понимаете это, особенно если Вы джун (опыта набраться у Вас в такой конторке не получится)
Вариант с методами лучше читается. Для формошлепства это важнее, чем "оптимизации", которые изменяют загрузку с мгновенно на чуть быстрее чем мгновенно. А там, где оптимизация - это важно, скорее всего решение этой задачки будет совсем не самой большой головной болью на собеседовании.
Ты на интуиции программируешь?
jsperf.com/palindrome/3
@@MrRagday я не собеседователь, но, как по мне, гораздо важнее, чтобы человек понимал как это работает, чем знал волшебные слова (reverse, split, join). Научить заклинаниям можно и обезьяну, толпы jqery програмыздов (которые не знают нативный JS) не дадут соврать.
Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.
Спасибо!
Отличное объяснение!!!!!!Спасибо!!
Очень интересно! Ждём новой части!
Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.
в данном примере пробелы не учитываются
Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!
let pal = (str) => {
if (typeof str != 'string') return false;
let tmp = [];
for(let c of str) {
tmp.unshift(c);
}
return tmp.join('') == str;
}
Не лучше ли вот так написать?
Тоже изучаю JS, но мне кажется есть еще один недочет. Если попросят проверить является ли строка палиндромом, то строка может содержать пробелы. Скажем, если передать в str "а роза упала на лапу азора" (что в тоже явялется строкой), такой вариант не сработает.
То есть к минусам данного метода, я бы еще добавил "работает только для слов". Ведь задание "является ли строка", а не является ли "слово". Тут нужно быть внимательным к деталям.
тогда скорее всего нужно избавится для начала от пробелов через replace, а потом все как в видео, конечно если просят вывести только true / false.
palindrom('ab ba ab ba') сработало. пробелы не проблема
@@3dzbotне самый лучший пример, сейчас я вам его сломаю. Проверьте "abb aab ba", что как бы тоже палиндром. Учитывайте индексы элементов строки.
@@dimanarizhnyi391 -> str = str.toLowerCase().replace(/\s/g, ''); где со сменой регистра так же добавляем рег.выражение .replace(/\s/g, '') которое убирает пробелы со строки. "а роза азора" решена :)
@@3dzbot да, но код явно отличается от того, что представлен в видео. Про это решение я тоже знаю.
С латиницей всё понятно-все работает.А вот с кирилицей будет ли так же срабатывать,или нужно ещё чтото дополнительно?
@user-nd4sl1lp9b,
UTF-16 работает через обычный индекс массива, или прямо строки. Если массив создан из строки через итератор (например ...) тогда и любые композитные символы, типа, эмодзи, работают. См. моё решение.
Если я передам число 101, ваш код сломается. Так как метода toLowerCase у Number нет.
Можно переписать еще безопаснее и в одну строку, переписав название метода на isPalindrom (правило именования по возвращаемому типу переменной)
const isPalindrom = str => str == String(str).toLowerCase().split('').reverse().join('')
Плюсы моего решения:
1) Строка
2) Безопасно работает со всеми типами, за счет наличия String (работает с массивами, объектами и тд и тп)
Вроде написано что строку передают
Классно)) мне понравилось такое решение))
да, особенно прикольно от 3 операций к одной.
1. toLowerCase можно тоже в возврат =).
2. слово "abrba" тоже является полиндромом об этом ни слова
3. данная задача даже не на ДЖУНА (по сути задача решается как и звучит (если развернуть слово наоборот то они будут равны), то есть ДУМАТЬ не нужно). Правильнее сформулированная задача о которой ты говоришь будет звучать так - "Определить, можно ли по входящей строке ПОСТРОИТЬ слово полиндром? то есть "abba" , "aabb" и "abbar" должны вернуть true, само слово строить не нужно, нужно лишь определить возможность." и вот тут начинаются сложности, при входящей строке в миллион символов... попробуй найти самое БЫСТРОЕ решение (АЛГОРИТМ) с МИНИМУМОМ циклов. Именно эту задачу задают при собеседовании на ПРОГРАММИСТА, а не определить что слово полиндром изначально... Которое решается в одну строчку.
4. Лайк если хочешь знать решение реальной задачи
в общем решил забить - правильный ответ:
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
Отличная задача. Я так понимаю, что нужно сначала проверить длину строки, потом проверить символы на парность. Если длина непарная - допустима одна непарная буква, если парная - все буквы должны быть в четном количестве? Ответ не смотрел, так неспортивно =Р
Андрей Галкин посмотрел твое решение... подумал... Понял, что достаточно просто проверить буквы на парность. Если останется одна непарная или ноль - годно. Нет - нет ;)
Кстати, вместо хешМеп-массива с прогонами индексОф-ом, можно сделать объект, а цикл проверяет есть ли свойство с именем, совпадающим с текущей буквой. если есть - удаляет его и идет к следующей букве, если нет - создает и идет к следующей букве.
Задача *гораздо* лучше чем в видео! Спасибо еще раз!
@@TheOlius решальщик, пробелы и регистр у тебя учтены?
Очень круто объяснили
спасибо!
еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл
да можно и самому, но обычно даже по такой маленькой задаче видно как и что.
Отличное видео! 👍
Спасибо!
Благодарю. И жду новых. Интересно.
Да, завтра будут новые.
очень хорошая и простая задача. особенно решение. лайк
0) Где проверка входных данных?
1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае.
2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.
Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи.
Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, "").
Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".
Так вот где спец по js скрылся. Искал - не выходил нигде, а тут случайно наткнулся в рекомендациях. Однозначно подписка.
Замечательного спеца нашли. Код которого не пройдет проверку первыми же примерами палиндромов из Википедии.
@@MrRagday можете посоветовать что то или кого то лучше?
@@zloy_tushkanchik learn.javascript.ru
Да тот же соракс на три головы выше этого "спеца"
Алекс очень поступков и полезно спасибо!
супер, класно, велике дякую!
Никогда не понимал, зачем в js нужна функция reverse. Ни разу в практике не понадобилась. Может кто-то знает?
Чтобы задачки на собеседованиях решать ))
Круто, спасибо!
Думаю для первой задачи такой код выглядит лутше:
const palindrom = string => {return (string.toLowerCase().split("").reverse().join("") == string.toLowerCase())? true : false;}
console.log(palindrom("HHHhh")); // true
После строки " str2 = str2.join;
"
"str2" необходимо преобразовать в строку, поскольку на данный момент это массив.
Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ".
А второй вариант работает некорректно и всегда выводит "true".
Эх, решил задачу в 20 строк, совсем забыл про сплит и реверс, видимо еще учиться и учиться
а какой у тебя опыт програмирования?
Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только ES6 синтаксис. Можете записать видео с решением?
а в чем проблема?) вот, держите) написано на коленке за 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() );
@@данилкононов-э3в Стрелочные методы идут с ES6 и выше, а не только начиная с ES7. А так да. Спасибо!
@@СерёгаСокольский стрелочные функции в ES6 появились, стрелочные методы в es7
метод - это функция экземпляра класса
На какую позицию собеседование?
@@MrRagday junior front-end
Как считаете? Если объединить код в return: return str = str.toLowerCase() && str == str.split('').reverse().join(''); // плохой ли это пример кода? (будут ли бить по рукам за это?)
Это лучше чем никакого решения. Но не очень читабельно. Подумай сам: хочешь ли ты работать в конторе, в которой пишут нечитабельный код?
А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи
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;
}
Нормально будет ? Или громоздко?
Алекс! А можем рассмотреть такой пример -
Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон)
Из базы данных подтягивается информация и выводит цены с учетом его скидки.
В топ!
Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.
@@ruslanfilyk2904 в целом норм.
Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.
зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему
Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.
Имхо, я как собеседующий ожидал бы решение с 2мя циклами. Это реально показал бы умеет ли думать Джун или нет
очень понятно объясняте, спасибо
Спасибо большое
это на джуна, чет очень легко, я бы попросил что бы строку разбили на слова и вырезали из нее слова палиндромы, и потом еще про сложность спросил этого решения... может развернуть их порядок в предложении ) ... в принципе не намного сложнее а места для полёта фантазии уже больше, и решать и проверять интереснее... хотя возможно я на собесах давно не был )
А имя функции не должно означать действие?
зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение?
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'));
Я вот такое понаписывал:
function palindrom() {
let word = prompt("put a word").toLowerCase();
let backWords = word.split("").reverse().join("");
if (word == backWords) {
return true;
} else {
return false;
}
}
str = 'abba'.split('')
let s = str.length
for(let i = 0; i < s; i++){
if(str[i] !== str[s - i - 1]){
console.log('Not a palindrom')
return 0
}
}
console.log('It is a palindrom')
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'))
А строку разве нельзя развернуть не переводя в массив?
@@sleepstream9433 ну как бы нах заморачиваться с массивом, если можно строку развернуть и сравнить
@@sleepstream9433 странное конечно решение, особенно если знаком с python
@@sleepstream9433 ну ну..
я же правильно понимаю, что если это все вдруг понадобится в синхронном выполнении (ну мало ли - запросы к серверу), то это все дело надо обернуть в async/await или промисами?
как лучше делать? И какая разница между spread оператором и простым методом split в данном случае?
1. [...str].reverse().join()
2. str.split('').reverse().join()
конкретно в данном случае никакой, а так split() более гибкий, ты можешь пихать в него аргументы, которые будут определять как именно сплитить данные, но он медленнее чем spread, так что все зависит от контекста в котором ты пременяешь эти методы
@@OnigiriKaizoku split быстрее спреда.
@@ale0x314 хз, проверил в консоли, и спред быстрее
Сплитом проще убрать пробелы и пунктуационные знаки.
Решил только у вас в раз 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 check (str) {
let str2 = "";
for (let i = str.length - 1; i >= 0; i--){
str2 += str[i];
}
console.log(str2 == str);
}
check ("ala");
Не жадничай на знаки "="
Есть способ решить задачу быстрее. Переводим строку в в список и итерируемся по индексам от 0 до середины и от конца до середины.Если элементы списка, взятые по данной паре индексов не совпадают, то сразу возвращаем false. Решение показывает не сколько знание языка, сколько понимание алгоритмов.
"Аргентина манит негра". Ваш вариант очень быстро даст неправильный ответ.
@@MrRagday Или правильный? Пробел это такой же юникодный символ, как и все остальные. Если в задаче не было условия отбрасывать пробелы, то ваша фраза палиндромом не является.
@@TonyFlexPromo Ну, перед решением задачи "Сделать проверку на палиндром" было бы неплохо узнать _что_ такое палиндром и какие они бывают, а не бежать кодить.
@@MrRagday Я вам про алгоритм, вы мне про детали реализации. Вы еще автору видео напишите, что у него все неправильно работает.
@@TonyFlexPromo Алгоритм, который для проверки палиндромов, который некорректно работает с популярнейшими палиндромами - негодный алгоритм. Его можно сделать очень-очень быстрым, но от этого он все равно не станет проходить корректные тесты.
Очень круто
А нового видоса нету или просто не найду?
Можно докапаюсь?)
Я бы написал строгое сравнение, чтоб в случае проблем с типами, там можно было отловить ошибку)
проблем с типами?)) приведите пример)
любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)
@@данилкононов-э3в ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая
да, лучше сразу привыкать
Как массив char рассмотреть строку вариант?
мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют
+ если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО
допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит.
получается надо убирать еще и пунктуационные знаки.
нюансов много
Сказано же, что мешают эмодзи. Автор думает про действительно тонкие вещи, а вы с пробелами и пунктуационными знаками лезете =Р
const isPalindrome = (str) => {
for(let i = 0 ; i< Math.round(str.length/2); i++) {
if(str[i] !== str[str.length-1-i]) {
return false;
}
return true;
}
}
Мне конечно очень интересно, но такие задачи по-видимо только логику улучшают ?
На практике дела обстоят намного хуже ? Те же задачи про ООП на собеседовании никто не спрашивает, а если примут и человек не сможет выполнить реальную задачу ?
ООП никто не спрашивает у js разрабов, потому что в нем нет ООП. соответственно ООП шаблоны проектирования не применимы. Ну главное наверно все таки чтобы логически человек мог представить, как что то должно работать
А как же всякие там конструкторы и классы в объектно-ориентированном программировании ?
@@grantruss5238Чтобы не было недопонимания в JS объекты и "классы" работают не так как в классическом ООП. По сути конструктор это просто функция возвращающая this. Что касается классов объявляя класс через относительно недавнюю фитчу class Name{} на самом вы объявляете функцию Name и добавляете на объект prototype методы это все не особо вяжется с классическим ООП.
Хотя я понял наверно про что вы, когда говорили о практике. разрабу нужно понимать именно как работает js в нем очень много подводных камней один this и зоны видимости не мало нервных клеток убили наверно)) это довольно тяжело объяснить в рамках таких видео, ну и это не базовые вещи. Если вам интересно и есть какие то базовые знания в языке, можете найти серию книг "You Don't Know JS" (Кайл Симпсон) там довольно интересно и понятно все написано, по поводу объектов это "this & Object Prototypes"
Дело в том, что на собеседовании нужно проверять самые глубины javascript, а не поверхность )
Там, где знания джунов проверяются такими задачами, ооп еще не скоро придется применять.
ребята помогите решить пожалуйста
На вход подается фраза на русском языке, содержащая числительное. Например, "Я хочу квартиру за 10.5 миллионов" или "Мне нравится когда моя машина, стоимостью сотку штук баксов, мелькает по телевизору". Необходимо выделить числительное в форме натурального числа и вернуть.
Все бы так код разбирали как вы:)
сделайте Пожалуйста видео как настраивать гугл карты подробно
Есть в курсе html.itgid.info
www.w3schools.com/graphics/google_maps_intro.asp ... куда уж подробнее )
будет ли продолжение? а то написано 5 задач, а разобрали одну :)
На прямую никто не изменяет аргументы функции..
let string = "Abba"
let ans = string => {
string = string.toLowerCase();
for(let i=0;i
const palindrom = (str) => str === str.toLowerCase().split('').reverse().join('');
А это популярные задачи на джуниорскую должность или в принципе? Вряд ли же на должность Senior разработчика просят решить палиндром.
от собеседующих во многом зависит... сам недавно по собеседованиям бегал на сеньера, и встречал разное, от банальных задачек из гугла, которые старше 5 лет (это при том, что в резюме у меня указан опыт проведения тех. собеседований), до вполне адекватных уровню "заревьювь код джуна", "построй архитектуру системы" ну или алгоритмические по типу "найди кратчайший путь во взвешенном графе".
сам никогда не даю типовые задачи, только авторские, обязательно проверю понимание промисов, а так же умение загуглить/поискать на mdn
@@ДмитрийБеляев-ъ1з понятно, спасибо. А от джуна тоже требуете/ожидаете хорошее понимание промисов?
Я сам по себе с++ разработчик, js знаю только ради того чтобы знать. Можете пожалуйста объяснить, чем ваш метод решения лучше чем обычное формирование строки (создаём новую строку и в цикле по 1 символу с конца к ней добавляем). Я не буду умничать или ещё что-то, ибо сам понимаю, что в вебе я не так уж и хорош, но если объективно смотреть со стороны, то ваше решение уступает в 3 раза по производительности. У вас в решении 3 перебора, соответственно это уже str.length*3 итераций, когда в решении формирования это просто str.length операций. Не знаю решает ли это проблему с эмодзи, но производительность явно выше, особенно если брать огромные строки. Объясните выбор именно этого решения, мне интересно почему, может я чего-то не понимаю?
Мне кажется на собеседовании должны брать именно оптимальные решения, а не легко-читаемые.
Все очень просто - мы можем сравнить и точно ответить. Скидывайте ваш метод решения.
@@itgid
function reverse(str)
{
str = str.toLowerCase();
var res="";
for(let i=str.length-1;i>=0;--i){
res+=str[i];
}
return res==str;
}
как с++ разработчик ты должен знать, что определения полиндрома может работать за str.length/2. + не используя лишнюю память в виде нового стринга, который ты создал
@@da_costa-h7t я же не делал проверку на палиндром дефолтным способом, я показал автору его же алгоритм только в 3 раза быстрее. А алгоритм это конкретно ревёрс строки с последующим сравнением с исходной строкой.
Лайк за Олега )) olleh ))
С числами не работает этот метод
Ребята всем привет завтра на собеседоваине будет тест js волнуюсь необеснять моё первоё собеседование
Этот способ не оптимальный по сложности. Лучше итерироваться по массиву и сравнивать буквы с начала и конца. При первом несовпадении возвращать false.
спасибо
function polindrom(str) {
str = String(str).toLowerCase();
let strReverse = str.split('').reverse().join('');
return strReverse === str
}
console.log(polindrom('aBBa abba'))
решил по своему
function palindrom(str) {
str.toLowerCase();
let validatePal = [...str].reverse().join('');
if(str === validatePal) return true;
else return false;
}
Такая функция раз в 8 быстрее:
function isPalindrom(str) {
str = str.toLowerCase();
return str === str.split('').reverse().join('');
}
function isPalindrom2(str) {
var strLength = str.length;
str = str.toLowerCase();
for (var i = 0; i < strLength/2; i++) {
if (str[i] !== str[strLength - i - 1]) {
return false;
}
}
return true;
}
function bench(f, str) {
var time = performance.now()
for (var i = 0; i < 1000000; i++) f(str);
return performance.now() - time;
}
console.log('isPalindrom, строка "hello": ' + bench(isPalindrom, 'hello') + 'мс');
console.log('isPalindrom, строка "abba": ' + bench(isPalindrom, 'abba') + 'мс');
console.log('isPalindrom2, строка "hello": ' + bench(isPalindrom2, 'hello') + 'мс');
console.log('isPalindrom2, строка "abba": ' + bench(isPalindrom2, 'abba') + 'мс');
В 8 раз? У меня на FF 58.0.2 (32-біт) такие результаты:
isPalindrom, строка "hello": 1165.22мс
isPalindrom, строка "abba": 1061.0600000000002мс
isPalindrom2, строка "hello": 19.11999999999989мс
isPalindrom2, строка "abba": 31.240000000000236мс
Кстати, после var time = performance.now() не хватает ;
Но этот тест не полный, нужно взять строку подлиннее (допилил код, чтобы результат выводил, палиндром или нет):
isPalindrom, строка "hello world, i`am best JS developer ewer!": 3837.4мс false
isPalindrom, строка "abcdefghijklmnopqrstuutsrqponmlkjihgfedcba": 3959.18мс true
isPalindrom2, строка "hello world, i`am best JS developer ewer!": 19.859999999999673мс false
isPalindrom2, строка "abcdefghijklmnopqrstuutsrqponmlkjihgfedcba": 317.8199999999997мс true
Как видим, если строка длинее, то всё ещё хуже. Особенно, если исходная строка не палиндром, второй код отваливается гораздо быстрее, в данном случае на первом же симовле.
@@simplewebdev1098 У меня на опере, хроме и ff результаты примерно такие:
isPalindrom, строка "hello": 283.04500004742295мс
isPalindrom, строка "abba": 251.47000001743436мс
isPalindrom2, строка "hello": 28.61999999731779мс
isPalindrom2, строка "abba": 36.019999999552965мс
@@lemran5033 моё "В 8 раз?" это не претензия. Это значит скорее "на разных системах и в разных браузерах по разному".