JavaScript 5 типовых задач на собеседовании, решаем их!
HTML-код
- Опубликовано: 26 сен 2024
- Курс JS: js.itgid.info
Курс верстки: html.itgid.info
Интернет магазин на Node: node.itgid.info
Плейлист: goo.gl/63osiv
Телеграм: t.me/jsrules
Мои курсы: itgid.info
понравилось, тока могли бы разделить по частям уроки а то люди будут думать что в этом видео все 5 задач
Ок. Добавлю части!
ЛаверКейс ;)
@@itgid не добавили....
@@itgid все еще не добавили...
@@itgid все еще не добавили....
Спасибо большое ! Очень здорово, что рассматривается не только решение , а и варианты оптимизации кода и недостатки. С нетерпением жду следующего видео !
Спасибо за решение задачи. Все по полочкам split.разложено, join.разжевано и в String положено :)
Я в 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)
Всегда думал, что на собеседованиях ценится хорошо читаемый код, а не псевдообфусцированный.
Скиньте видео с остальными 4 задачами? очень тяжеловато найти :(
Могу предложить более оптимальный способ. Если критерий оптимальности сложность алгоритма, а не, например, количество кода. Идея в том, чтобы не сравнивать всю строку, а отлетать на первом неравном символе. Мы подготавливаем массив: преобразуем строку в массив, убираем пробелы и знаки препинания, приводим всё к нижнему регистру, и т.п.
Далее
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. Не нравится он мне, и всё ))
На видео на 4:14 -->> let str2 = str.split('');
В 2019ом году для преобразования в массив проще писать let str2 = [...str1]
Итераторы и деструктуризация во всей их красе :)
Да у автора проблемы с наименованием.
то есть с помощью оператора spread можно из строки сделать массив? Надо будет попробовать на практике:)
Спасибо за информацию
7:02 Звучит так, как будто всегда чем короче, тем лучше, на деле, если такого принципа придерживаться, то дебажить становится в разы сложнее, да и на выразительности кода это сильно сказывается, особенно если описывается не самая очевидная логика, а ещё можно упомянуть, что методы массивов делятся на те, которые мутируют сам массив и те, которые этого не делают, в частности reverse его мутирует, для данного решения не очень существенно, но на практике очень важно это помнить. А за видео спасибо, хороший разбор типовой задачи.
для того чтобы избежать мутирования можно использовать slice() или concat() перед самим ревёрсом, тогда получится новый массив, но т.к. мы нигде с исходным массивом не взаимодействуем, это лишний код который просто нагружает логику.
Плюс декларативные конструкции(как в окончательном решении) читать и понимать намного легче чем то, что было в начале
Можно ничего не делать с входной строкой.
Имеет значение четное число символов или нет.
Можно двигаться по массиву и сравнивать первый символ с последним, и сужаться до середины. В итоге сложность будет O(n), по памяти O(1).
Если строка не четная, то символ в середине можно не смотреть.
Почитайте книгу "Cracking coding interview".
Я тоже сначала так подумал )) Но потом прикинул - а ведь пофиг чётное количество или нет. Делаешь цикл до "длинна строки делённая на 2" например 5/2 = 2 (остальное в остатке); а 3й символ можно не сравнивать )) Всё выше справедливо для плюсов.
"Аргентина манит негра"
@@senioreasy верно, но только в JS 5/2 = 2.5. Нужно округлять, хотя, с другой стороны, не нужно. Ибо 3 всё равно > 2.5 так что для сравнения пойдёт.
Ты там что, строки в миллион символов собрался проверять на палиндром? Такой задачи не существует в природе Ещё экономить ресурсы и проверять только половину строки, жесть. Пока ты строку будешь делить на два и ставить указатели, простой скрипт в одну строку и понятнее читается и отработает быстрее.
Mister X комментарии ты конечно мастер писать, но это классический алгоритм проверки строки на палиндром. Кроме того, задача может быть не в том, что проверять надо одну большую строку, а много маленьких и эффективность не помешает.
Можно написать код длиннее,но оптимальнее по времени,так как создавать вторую строку,переворачивать ее и сравнивать с другой очень долго при больших строках.
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)
В чем смысл ускорять некорректный код?
В палиндроме, я бы все же сделал
const reversedString = str.split('').reverse().join('')
return string === reversedString
Так будет на одну строчку больше, но сразу повышается читаемость кода.
function palindrome(str) {
return str.toLowerCase().split('').reverse().join('') == str;
}
Лучший канал про Web
Согласен!
Самокритично)
Спасибо братка, крепкого тебе здоровья!
Спасибо!
Полностью поддерживаю Roman! Объясняет, раскладывая все по полочкам! Прохожу курс, очень довольна!
Первой строкой в функции надо проверять, что длина строки более 1 символа, иначе сразу возвращать true.
Ещё передать могут что попало вместо строки, например объект. Тоже надо проверять.
Классный канал. Я наконец понял работу с массивами.
Супер!
Просто лучший в мире за работой.
Думаю для первой задачи такой код выглядит лутше:
const palindrom = string => {return (string.toLowerCase().split("").reverse().join("") == string.toLowerCase())? true : false;}
console.log(palindrom("HHHhh")); // true
написал за 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)
}
Еще есть такое решение:
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я А если лично я считаю, что у палиндрома длина строки не может превышать единицу, то решение const isPalindrome = (str) => str === str.charAt(0); резко станет правильным?
@@MrRagday Да, для тебя станет правильным (но не истенным), ты же этого хотел добиться, 121 - это палиндром? А в двоичной системе? Можно полагаться на википедию, но там про эмоджи ничего нет. Зато там есть магический квадрат, про который никто ничего не сказал.
@@МихаилВикторович-р2я 121 - это палиндром. И в двоичной системе тоже. А вот придумывать свои определения словам, у которых есть общепринятое значение - дело нехорошее. Хотя запретить я тебе, конечно, не могу)
MrRagday в двоичной тоже, ну ну
0) Где проверка входных данных?
1) Я бы возмутился именованием функции. Логичнее было бы назвать checkIsPalendrome или isPalendrome в крайнем случае.
2) Алгоритмическая сложность этого решения о(n) всегда т.к. для реверса нужно пройти весь массив, я бы посимвольно проверял символы, шагая от начала до середины массива и сравнивая их с соответствующими символами, взятыми от конца массива. В этом случае ещё бы и расход памяти уменьшился, а сложность алгоритма была бы о(n/2) в худшем случае и о(1) в лучшем случае. + такой подход позволил бы вылавливать эмодзи без лишних велокостылей.
так же есть вот такой варинат функции, которая определяет палиндром
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
Пробелы, запятые и т.п. - куда более серьезные проблемы, чем эмодзи.
Чтобы работало с предложениями, нужно ещё сделать str.replace(/\W/g, "").
Чтобы обрабатывало без ошибок числа, undefined и т.п., нужно в начале добавить str+"".
Очень интересно! Ждём новой части!
Этот палиндром мне теперь во сне как ужастик сниться будет 😅
Объясняешь круто! Я вообще питон учу, но так как автор преподносит инфу, мне ничего не мешает параллельно рассматривать js. Если будет курс по питону, я б глянул.
Спасибо!
Самый классический палиндром:"А роза упала на лапу Азора". Данная функция его не определит. Необходимо перед сравнением удалать все пробелы и знаки препинания. Проблема со смайликами мне кажется гораздо менее важной, чем эта.
зависит этот требований. если у нас предполагается что строку будет без пробелов, то нет смысла это проверять. А если нет, то обычный str.split(' ').join('') решает проблему
Класс, продолжай, как раз буду устраиваться js js se
Вау, круто. Видел похожую задачу, там парень так закрутил чтоб её решить, а тут всё просто, понятно. Дома попробую сделать по памяти. Спасибо большое!!
Со строкой все довольно просто, но часто встречаются задачи по типу "проверьте является ли целое число палиндромом"
На такой случай я знаю красивый алгоритм:
// функция, которая разворачивает число по принципу чтения числа задом наперед
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 ну кстати логично)
Может, стоит ещё пробелы убирать в строках при проверке палиндрома? "А роза упала на лапу Азора" - палиндром, но данный метод вернёт false, поскольку пробелы в разных местах.
в данном примере пробелы не учитываются
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 решальщик, пробелы и регистр у тебя учтены?
Тоже изучаю 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 да, но код явно отличается от того, что представлен в видео. Про это решение я тоже знаю.
Благодарю. И жду новых. Интересно.
Да, завтра будут новые.
Так вот где спец по js скрылся. Искал - не выходил нигде, а тут случайно наткнулся в рекомендациях. Однозначно подписка.
Замечательного спеца нашли. Код которого не пройдет проверку первыми же примерами палиндромов из Википедии.
@@MrRagday можете посоветовать что то или кого то лучше?
@@zloy_tushkanchik learn.javascript.ru
Да тот же соракс на три головы выше этого "спеца"
Очень круто объяснили
спасибо!
еще наверное б добавил что просят вместо reverse() и как оказалось что еще вариант который от меня хотели услышать это обратный цыкл
да можно и самому, но обычно даже по такой маленькой задаче видно как и что.
Отличное объяснение!!!!!!Спасибо!!
очень хорошая и простая задача. особенно решение. лайк
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')
а еще можно оптимизировать этот метод проверяя на нечетность и проверяя в цикле посимвольно тип такого:
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 да, ты прав, всё-таки писать код в комментарии не очень удобно, пропустил этот момент
После строки " str2 = str2.join;
"
"str2" необходимо преобразовать в строку, поскольку на данный момент это массив.
Сделать это можно подобным образом: " str2 = " "; ". Иначе функция возвращает " false ".
А второй вариант работает некорректно и всегда выводит "true".
function check (str) {
let str2 = "";
for (let i = str.length - 1; i >= 0; i--){
str2 += str[i];
}
console.log(str2 == str);
}
check ("ala");
Не жадничай на знаки "="
Алекс очень поступков и полезно спасибо!
Как обычно топчик)
Спасибо!
Классно)) мне понравилось такое решение))
да, особенно прикольно от 3 операций к одной.
let string = "Abba"
let ans = string => {
string = string.toLowerCase();
for(let i=0;i
Имхо, я как собеседующий ожидал бы решение с 2мя циклами. Это реально показал бы умеет ли думать Джун или нет
Решил только у вас в раз 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);
}
зацените, сделал так, чтобы ответ был верным независимо от заглавных или строчных букв. Верное решение?
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(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'))
На прямую никто не изменяет аргументы функции..
Эх, решил задачу в 20 строк, совсем забыл про сплит и реверс, видимо еще учиться и учиться
С латиницей всё понятно-все работает.А вот с кирилицей будет ли так же срабатывать,или нужно ещё чтото дополнительно?
@user-nd4sl1lp9b,
UTF-16 работает через обычный индекс массива, или прямо строки. Если массив создан из строки через итератор (например ...) тогда и любые композитные символы, типа, эмодзи, работают. См. моё решение.
очень понятно объясняте, спасибо
Здравствуйте ,можете объяснить , в вашем коде мы используем множество методов ,поэтому колличесто итераций высокое , не проще ли написать так(с телефона код вставить не могу ,но попробую объяснить):
переводим в нижний регистр, потом проходимся циклом 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) не дадут соврать.
Есть одно но, задачу можно решить без использования массива. У меня на собеседовании была эта задача, но к ней прилагались условия память m(1), все символы в сравнении учавствуют один раз, строка может содержать пробелы и другие спец символы, не являющиеся буквами, такие символы должны быть проигнорированы, пустая строка является полиндромом.
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;
}
}
Я вот такое понаписывал:
function palindrom() {
let word = prompt("put a word").toLowerCase();
let backWords = word.split("").reverse().join("");
if (word == backWords) {
return true;
} else {
return false;
}
}
Отличное видео! 👍
Спасибо!
const palindrom = (str) => str === str.toLowerCase().split('').reverse().join('');
супер, класно, велике дякую!
Круто, спасибо!
Никогда не понимал, зачем в js нужна функция reverse. Ни разу в практике не понадобилась. Может кто-то знает?
Чтобы задачки на собеседованиях решать ))
это на джуна, чет очень легко, я бы попросил что бы строку разбили на слова и вырезали из нее слова палиндромы, и потом еще про сложность спросил этого решения... может развернуть их порядок в предложении ) ... в принципе не намного сложнее а места для полёта фантазии уже больше, и решать и проверять интереснее... хотя возможно я на собесах давно не был )
Алекс! А можем рассмотреть такой пример -
Покупатель заходит на сайт вводит свои данные (ФИО или лучше телефон)
Из базы данных подтягивается информация и выводит цены с учетом его скидки.
В топ!
Делаешь MySQL табличку с колонками (phone, discount), потом через какой-нибудь запрос обращаешься к этой таблице (мы учили ajax, но это старая штука насколько я знаю), пишешь SELECT discount FROM WHERE phone = ; После при прогрузке товаров из другой базы просто умножаешь price *= 1 + discount / 100 (если в процентах). Если не прав поправьте пож, не особо шарю это дело.
@@ruslanfilyk2904 в целом норм.
let pal = (str) => {
if (typeof str != 'string') return false;
let tmp = [];
for(let c of str) {
tmp.unshift(c);
}
return tmp.join('') == str;
}
Не лучше ли вот так написать?
А если цикл выдать интервьюеру типа такого , зная кейс про эмодзи
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;
}
Нормально будет ? Или громоздко?
будет ли продолжение? а то написано 5 задач, а разобрали одну :)
а какой у тебя опыт програмирования?
Лайк за Олега )) olleh ))
мне кажется, надо убрать все пробелы перед сравнением, т.к. они ни на что не влияют
+ если мы хотим найти слова-полиндромы из текста, то нам надо сделать из текста массив, разделить его по пробелам и пройтись по этому массиву этой функцией, НО
допустим у нас следующий текст: "Abba, Rolling Stone - good groups" и в нашу функцию придет строка "Abba," и функция вернет false, т.к. запятая все нарушит.
получается надо убирать еще и пунктуационные знаки.
нюансов много
Сказано же, что мешают эмодзи. Автор думает про действительно тонкие вещи, а вы с пробелами и пунктуационными знаками лезете =Р
То есть никакого алгоритма действий, ни описания плана, сразу начинаем колбасить функцию, хорошее начало =(, я бы это назвал worst practice для начинающзего разработчика.
@@arleenlasleur Привыкай сперва расписывать то что ты будешь делать , то есть пошаговые действия, сперва прописывай на бумаге привыкая продумывать алгоритм ,без выписывания синтаксиса, потом когда это тебе уже будет привычно продумывай в голове и пиши функцию.
Спасибо большое
Ребята всем привет завтра на собеседоваине будет тест js волнуюсь необеснять моё первоё собеседование
function polindrom(str) {
str = String(str).toLowerCase();
let strReverse = str.split('').reverse().join('');
return strReverse === str
}
console.log(polindrom('aBBa abba'))
Очень круто
Спасибо;)
Ожидал увидеть алгоритмическое решение, но увы...
ребята помогите решить пожалуйста
На вход подается фраза на русском языке, содержащая числительное. Например, "Я хочу квартиру за 10.5 миллионов" или "Мне нравится когда моя машина, стоимостью сотку штук баксов, мелькает по телевизору". Необходимо выделить числительное в форме натурального числа и вернуть.
Получается Олег
Можно докапаюсь?)
Я бы написал строгое сравнение, чтоб в случае проблем с типами, там можно было отловить ошибку)
проблем с типами?)) приведите пример)
любой из типов, кроме строки выкинет исключение в консоль)) ни цифры, ни объекты, ни тем более, symbol не может быть .туЛоуверкейс().. про налы и андефайнды я вообще молчу)
@@данилкононов-э3в ну это в данном случае, а привыкать лучше к этой практике, потому что если мы откроем сложный проект, то там это пригодится, да и вообще это практика хорошая
да, лучше сразу привыкать
Для собеседование неплохо, т.к. показываем знание методов строк и массивов, НО! - задача сводится к простому перебору строки и создание массива, реверс и перевод в строку - это лишние телодвижения для движка. Ни в коем случае не критика.
function palindrom(str) {
let max_ind = str.length - 1;
let center = Math.trunc(max_ind / 2);
for (let i = 0; i
Спасибо
Да не согласен я. Если бы я проводил собеседование то меня бы устроил первый ответ где много строк и комментарии. Я хочу видеть понимает ли испытуемый суть. А решение в одну строку выглядит как зазубривание. Просто человек предполагал что может быть такая задача и зазубрил "крутое" решение. А что касается стрелочных функций, я бы убивал на месте за такие решения. Я хочу видеть знает ли испытуемый что делает, а не знает ли месье толк в извращениях. :-)
решил по своему
function palindrom(str) {
str.toLowerCase();
let validatePal = [...str].reverse().join('');
if(str === validatePal) return true;
else return false;
}
А имя функции не должно означать действие?
А строку разве нельзя развернуть не переводя в массив?
@@sleepstream9433 ну как бы нах заморачиваться с массивом, если можно строку развернуть и сравнить
@@sleepstream9433 странное конечно решение, особенно если знаком с python
@@sleepstream9433 ну ну..
сделайте Пожалуйста видео как настраивать гугл карты подробно
Есть в курсе html.itgid.info
www.w3schools.com/graphics/google_maps_intro.asp ... куда уж подробнее )
Я как-то решал задачу на собеседовании - создать класс расчёта з / п сотруднику, исходя из ставки, премии и стажа работы. Применять только 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
"5 типовых задач" - задача одна.
"Одно маленькое но - эмодзи" - Попробуй потестить этот код с таким палиндромом: "Аргентина манит негра".
Ужасно.
строго говоря это не палиндром, тк пробелы не симметричны. Тут зависит от того, какой палиндром ищется - машинного представления или человеческого
@@EgorMem ПАЛИНДРО́М
Мужской родСПЕЦИАЛЬНОЕ
Слово или фраза, которые одинаково читаются слева направо и справа налево.
"П. «Я иду с мечем судия»"
@@EgorMem *Иногда* палиндромом называют любой симметричный относительно своей середины набор символов[4][5].
все зависит от поставленой задачи, тем более на интервью, чем меньше ты говоришь тем лучше.
для того, чтобы решить такой палиндром, нужно записать в массив не все элементы а только буквы используя регулярное выражение.
если ты не до конца понимаешь как это работает то, лучше не использовать пока тебя не попросят
Перед переводом в нижний регистр нужно удалять лишние символы и оставлять только буквы и цифры. Что сложного? Это настолько очевидно...
Я хз как там на жабоскрипте, на питоне это одна строчка, которая ещё и пробелы чекает с твоей ебаной аргентиной, на жавоскрипте то же самое сделать можно даже ребёнку 8 лет, а не задавать тупые вопросы.
str1 = input("text: ")
print(str1.lower().replace(" ","") == str1.lower().replace(" ", "")[::-1])
Вы завалили собеседование... Вместо нормального решения со сложностью O(n/2) представлено решение с O(3*n); так же не учтено, что строки в памяти у js хранятся в utf16, любой символ представленный суррогатной парой (а не только емоджи) приведет к неверному результату; ну и в конце концов, здесь банально ожидается от кандидата знание, что строики индексируются...
Ну почему же? Собеседование на бесплатные курсы по JS (даже на те, где гарантируется трудоустройство джуниором для закончивших) создатель видео пройдет и пройдет хорошо ;)
Этот способ не оптимальный по сложности. Лучше итерироваться по массиву и сравнивать буквы с начала и конца. При первом несовпадении возвращать 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 раз?" это не претензия. Это значит скорее "на разных системах и в разных браузерах по разному".
Я только начал изучать JS, пока на всяких рекурсиях сижу, абстракциях (ребятам с hexlet'а привет =)), и вот совершенно не понимаю прикола в этом слабом сравнении, слабая типизация js ведь только и позволяет, что превращать ошибки разработчиков в НЕошибки, кому нужно это слабое сравнение по типу 4 == '04' // true, как по мне, такой подход может лишь добавить проблем в будущем, и опытные разработчики его не используют. При строгом сравнении никаких вопросов нет, даже '\0' не упустит и уже задача разработчика не упустить подобный момент, как раз что-то рядом с этими эмодзи.
Это не баг, это фича.
Мне конечно очень интересно, но такие задачи по-видимо только логику улучшают ?
На практике дела обстоят намного хуже ? Те же задачи про ООП на собеседовании никто не спрашивает, а если примут и человек не сможет выполнить реальную задачу ?
ООП никто не спрашивает у js разрабов, потому что в нем нет ООП. соответственно ООП шаблоны проектирования не применимы. Ну главное наверно все таки чтобы логически человек мог представить, как что то должно работать
А как же всякие там конструкторы и классы в объектно-ориентированном программировании ?
@@grantruss5238Чтобы не было недопонимания в JS объекты и "классы" работают не так как в классическом ООП. По сути конструктор это просто функция возвращающая this. Что касается классов объявляя класс через относительно недавнюю фитчу class Name{} на самом вы объявляете функцию Name и добавляете на объект prototype методы это все не особо вяжется с классическим ООП.
Хотя я понял наверно про что вы, когда говорили о практике. разрабу нужно понимать именно как работает js в нем очень много подводных камней один this и зоны видимости не мало нервных клеток убили наверно)) это довольно тяжело объяснить в рамках таких видео, ну и это не базовые вещи. Если вам интересно и есть какие то базовые знания в языке, можете найти серию книг "You Don't Know JS" (Кайл Симпсон) там довольно интересно и понятно все написано, по поводу объектов это "this & Object Prototypes"
Дело в том, что на собеседовании нужно проверять самые глубины javascript, а не поверхность )
Там, где знания джунов проверяются такими задачами, ооп еще не скоро придется применять.
Как массив char рассмотреть строку вариант?
А потом опытный программист спросит "а как вы решите задачу с эмозди"
А нового видоса нету или просто не найду?