Задачи На Собеседовании Junior / Middle Frontend Developer. Массивы в JavaScript.
HTML-код
- Опубликовано: 14 июн 2024
- Разбираем задачи которые часто спрашивают на собеседовании Junior и Middle Frontend Developer. В этом ролике решаем часто задаваемые задачи по массивам в JavaScript. Разбираем разные способы решения задач + некоторые фишки в JavaScript. Напишите в комментариях какие еще вопросы вам задавали на Frontend собеседованиях и как вы с ними справились!
Таймкоды:
00:00 - Сумма элементов массива. №1.
00:51 - Сумма элементов массива. №2.
01:36 - Сумма элементов массива. №3.
02:12 - Максимальный / минимальный элемент массива. №1.
03:10 - Максимальный / минимальный элемент массива. Вариации первого способа.
03:50 - Максимальный / минимальный элемент массива. №2.
04:20 - Максимальный / минимальный элемент массива. №3.
04:46 - Максимальный / минимальный элемент массива. №4.
05:32 - Сортировка массива.
06:52 - Сортировка массива с объектами по их полям (по алфавиту и по возрастанию).
09:50 - Развернуть массив без .reverse().
11:29 -💡Сможешь понять этот код?
12:10 - Отфильтровать falsy значения
Приятного просмотра! Буду благодарен за поддержку в виде комментария и лайка!
👉 Исходный код, чат, воркшопы и поддержка канала: / wisejs
✔️ Если хочешь изучать программирование со мной, не забудь подписаться :)
ruclips.net/channel/UCOxq...
✔️ Мой телеграм канал: t.me/joinchat/RVq-cmt6n1SJRS7Z
#собесесдованиеjavascript #собеседованиеfrontend #массивы #javascript #frontend #array #juniorjavascript #middlejavascript #вопросынасобеседовании
Домашнее задание: Найти дубликаты (повторяющиеся элементы) в массиве. Решение присылайте в комментарии 👇
uniqueNumbers = new Set(array)
@@imthebest8000 это не найдёт дубликаты
@@9mikaela да, я просто не правильно прочёл задание
Для числового массива: arrayWithDublicates.sort((x1, x2) => x1 - x2).reduce((acc, next, index, arr) => next === arr[index + 1] ? [...acc, next] : acc, []). Для других типов данных меняем сортировку, которая была подробно рассмотрена в ролике👆
array.filter( (el, i) => i !== array.lastIndexOf(el) )
Спасибо,Максим,что продолжаете радовать нас отличным контентом,очень крутое видео!
Как раз прохожу собесы сейчас. То, что нужно как раз👌 . Спасибо 😉
Контент богов! Наконец-то я нашел то, что искал. Сколько не гуглил задачи на массивы, выдаются сразу довольно сложные примеры, на которых разобраться в теме очень сложно. А тут как раз базовые задачи, да еще и с несколькими вариантами решений. Спасибо огромное!
покажика эти сложные задачи)попробую их на зубок чтоб отскакивала как таблица умножения
Дружище, ты просто машина, я бы сказал - живой калькулятор)
Подписка и лайк однозначно!
Классное видео. Интересные примеры. Спасибо
Классный видосик. Гоу теперь про объекты :)
благодарю за момент с сортировкой, на прошлом собесе не смог внятно ответить, а тут вот оно как))
Классный выпуск,большое спасибо! js, reduce, map, filter, sort, pop.
Спасибо за ключевые слова!
Great job 🔥 Keep on going!
Сейчас готовлюсь к собесам на новую работу, ставил на паузу и решил всё, НО некоторые твои варианты взорвали мозг) реально круто!
Как новая работа?
@@Yupitrerда жестко бывает т.к. компания небольшая и должность размыта.. я типа фронтенд, но так же и бекенд писать приходится, и на AWS колупаться постоянно.. такое..но, бабки платят и хорошо;)
Какие задачи по алгоритмам пригодились для собеса
?
@@adamarturov6361 это год назад уже было, не помню, но может быть что угодно из них.
спасибо, контент огонь
Полезно ! спасибо !
ты крутой! я подписался) нажал лайк, надеюсь у вас будут выходить такие позновательные видео
спасибо , продолжай!
👌 буду решать
Для разворачивания массива можно воспользоваться методом массива reduceRight, который работает как обычный, но итерируется с конца массива
const reversedArray = array.reduceRight((accum, elem) => {
accum.push(elem);
return accum;
}, []);
array.reduceRight((acc, item) => {
return [
...acc, item
]
},
[])
Пушить в аккумулятор плохая практика
@@SuperPirks в каком месте это плохая практика? Вот клонировать массив на каждой итерации - это действительно плохая практика.
@@SuperPirks лучше acc.concat(item)
Привет ✌️
Спасибо 🔥👍
Класс! Сделай еще задачки с циклами))
Хорошая идея)
Отличный видос)
привет . спасибо за видео
it's most popular information! thanks
12:00: вторым аргументом назначаем this = наш array. первым аргументом, т.е. в качестве вызываемого колбэка передаем метод массива pop(), который внутри обращается к this т.е. к массиву, у которого вызывается. если я правильно поняла, когда что-то передается в качестве аргумента оно теряет контекст, потому что это вроде как эквивалентно присвоению переменной. поэтому нам нужно передать контекст вторым аргументом
Делюсь опытом, была задача на собеседовании написать функцию для проверки слова на палиндром, там работа и с массивом, и с строкой. Кто не знает, что это такое и как ее решать, советую глянуть.
А где найти видео не смог найти видео с решением задачи
А чего там решать? Слово в массив, массив развернуть и склеить в слово, результат сравнить с первоначальный словом. Можно с циклом заморочится или рекурсией. Для зарядки ума.
Перевернуть массив можно и нужно за O(n) и без доппамяти.
Нужно в цикле от 0 до length/2 менять местами i-ый элемент с length - 1 - i
От души
Обычно в продакшене готовые апи юзаешь, Бек уже все отфильтровал )
не понял про array.filter(boolean) почему работает? Если весь массив передается, почему он возвращает все те что тру ведь boolean === true равно фолс
а почему, если не использовать деструктуризацию в выражении array.map(array.pop, array), вернет [6,6,5,4,,,] ?
Привет, найти самое редковстречающееся значение в числовом массиве, или сгенерировать n массив, заполненный рандомными числами от min до max)
Тоже попадалось с рандомными числами
В версиях node до 12, можно обмануть систему, т.к. сорт на малых объемах массива использует сортировку слиянием, мы можем произвести следующиее, a.sort(e=>1), еденицу можно заменить на любое положительное число, оно будет выполнять роль положительного резульятата сравнения элементов слева на право. Если уж идти по тропе шизокода, стоит писать все в круглых скобках, дабы избавиться от ключевых слов, методы вызывать следующим образом - a=[3,4,5,1,2,6], [j,o,i,n]=`join`, eval(a[j+o+i+n]`+`) и многое другое )))))
И решение - a.map(a.pop,[...a]), взято из задачи 3 kyu на CW )))))
У тебя хороший контент по технологиям, но задачки, это совсем другое, все тонкости JS врядли выйдет разобрать, да это и не нужно обычным людям.
Ставлю этому видику 7kyu ))))
Интересно 🧐
@@wisejs Если человек хочет впечатлить собеседующего, рекомендую провести тутор - как писать код столбиком, по 1 символу в строке ))))
@@lambdius 😂
Дз: создать объект где ключом будут значения элементов массива, а значением - количество их повторений и в зависимости от задачи перебрать объект.
Все так, но вместо объекта лучше Map 😆
Найти максимальный элемент массива через сортировку это гениально
Это был сарказм? Просто я новичок и немогу пока точно понять хорошо это или плохо.
@@LuNa-om8ci объясню проще: вместо линейной сложности мы используем квадратичную
прикольный канал, не помню откуда я тебя взял
🧐
09:50
const arrow = [1,2,3,4,5,6,7,9,12]
console.log(arrow.sort(() => {return -1}));
тоже идеально будет работать
отлично решение, вот его упрощенная запись (без return и фигурных скобок):
arrow.sort(() => -1)
Можно больше задач по JS c собеседований
В последней задаче зачем в иф делать !! если все что в условии и так приведется в бул значение
Спасибо, array.filter(item => item) тоже сработает
8:38 ошибка в строке 23, в if-е должен стоять ===.
В предпоследней задаче можно было бы воспользоваться методом sort:
const arr = [1, 2, 3, 4, 5, 6, 88];
const reversed = arr.sort((a, b) => {
return b - a;
});
console.log(reversed);
не можно, потому что задача развернуть а не отсортировать. вот с таким массивом не будет работать верно: const arr = [1, 22, 3, 4, 5, 6, 88]
Привет ) Скажи пожалуйста что за шрифт у тебя в web-storm ? Заранее спасибо )
Дефолтный, не менял
@@wisejs спасибо )
jetbrains mono
Есть еще функция Есть еще функция getMaxOfArray ([1, 2, 3])
Решение второй задачи, зачем мудрить?))
const max = Math.max(...array);
const min = Math.min(...array);
За eval по рукам надо бить))
Задача. Есть четыре массива по 4 цифры, цифры разбросаны, найти максимальное число , и вывести новый массив максимальных чисел.
Сводится к поиску максимального числа в матрице (насколько я понимаю)
лайк за localeCompare
Никто не пишет вручную алгоритмы, вместо этого используют lodash, в котором они реализованы
Это websrorm ?
Альтернатива для reverse)
array.reduceRight((acc, item) => [...acc, item], [])
Это когда лень писать for с обратным циклом))
Спасибо, что поделились решением! Способ вполне работающий, но у него всё же квадратичная сложность по времени из-за пепесоздания массива на каждой итерации. Можно переписать примерно так: array.reduceRight((acc, item) => (acc.push(item), acc), [])
...или даже решить через map:
array.map((_, i, arr) => arr.at(~i))
@@SerzhNesteruk с первым вашим решением согласен, да, но второе читается сложновато)) заставляет залезть в доку и чекнуть инфу про тильду и at
map(callbackFn, thisArg)
Array(array.length).fill(null).map([].pop, [...array]);
де:
Array(array.length).fill(null) - масив будь-яких значень аналогічної довжини
[].pop - потрібна сама функція
[...array] - масив, з якого на кожному кроці буде забиратися останнє значення. Якщо без ... (деструктиризації), тоді очистить попередній масив array
array.map([].pop, [...array])
const max = arr.toSorted((a, b) => b - a)[0];
Касательно варианта с разворотом массива, можно еще воспользоваться reduceRight. =)
arr.reduceRight((p, c) => [...p, c], []);
а разве нельзя развернуть массив тем же методом sort, только возвращать x2 - x1 вместо x1 - x2?
и в filter просто использовать сам текущий item без boolean
x2 - x1 - отсортирует по убыванию
да, так можно, но не особо очевидно как по мне
Нет, нельзя. Если массив изначально не сортирован, то такой "разворот" вернёт сортированный.
Домашнее задание: Можно использовать new Set... [...new Set(someArray)]
Не убрать их, а найти :)
eval это прикол конечно, думаю лучше так не делать на собеседовании 😅
Стосовно розвертання масиву через map(array.pop, array) функція видаляє останній елемент масиву і повертає його, який в свою чергу записується в результат функції map. А в якості this для метода pop передається array, який скорочується.
const arrey = [1, 2, 3, 4]
const xw = arrey.reduce((x, y) => x + y);
console.log(xw)
это по короче
Стало интересно и пошел разбираться. С некоторым успехом вроде что-то вышло.😁
Для данной записи: [...ourArr].map(array.pop, ourArr)
- array.pop - это мы просто передаем метод массива, аналогично и этой записи: [].pop
Метод array.pop удаляет последний элемент массива и возвращает его.
Второй агрумент "ourArr" для метода map нужен для того, чтобы именно было что возвращать в новый массив, который создает метод map. Значение для нового элемента массива возвращается на каждой итерации из ourArr, который мы передали для метода [].pop в качестве this.
Новый массив [...ourArr] нужен только для того, чтобы было по чему нам итерироваться. Будет аналогично и работать так же для записи:
[undefined, undefined, undefined, undefined, undefined].map(array.pop, ourArray)
Кажется, что я только запутал.😂
Ход мыслей верный 🙂
@@wisejs Ну и хорошо значит.😁
Array.from( new Array(arr.length) , () => arr.pop() ) в пустой массив той же длины накидываются попнутые значения. Так это выглядит в читаемой реализации, хотя всё равно способ идиотский, так как происходит мутация исходного массива. Еще при этом зачем-то усложнил получением ссылки на метод массива и прокинутым в неё this. Любителей всё усложнять везде же любят)
@@Kaorichvagon Здесь, кстати, тоже можно поумничать с Array.prototype.pop и thisArg, но хотя бы сохранив иммутабельность исходного массива:
Array.from(arr, [].pop, [...arr])
А учитывая, что вторым аргументом Array.from является mapFn, то можно просто использовать сам метод map:
arr.map([].pop, [...arr])
Но можно решить и рациональнее:
arr.map((_, i, arr) => arr.at(~i))
3:11 через sort было бы легче и быстрее сделать как мне кажется
4:19
ну не знаю не знаю, мне и на джуна задачи сложнее попадались
Последний пример мутирует предыдущий массив, это плохо)
Последний пример какой задачи?
Развернуть массив
не всегда плохо, зависит от требований
@@wisejs но сначала-то все примеры без мутации
что мешало array.map([].pop, [...array]) ?
если мутировать оригинальный массив - надо было и с двумя указателями дать пример
просили найти второе и третье максимальное значение массива перебрав его всего один раз
Как решали? Сортировкой?
@@wisejs сортировкой делать было нельзя. Поэтому прошелся обычным for-ом. Но и это их не устроило. Сказали мой алгоритм слишком затратный. Это было тюлет 3 назад
@@azizoid O(n2 если 2 раза перебирал. Хотели, наверное, быстрее.
@@wisejs простой сортировкой эту задачу не решить, потому что могут быть дубликаты, придется set еще городить, это не рационально
upd: зато читабельно, и чаще всего на фронте глубоко пофиг, сколько займет операция с массивом - 3мс или 10мс, а вот разбираться с кодом из кучи циклов нахрен никому не упало
let max = -Infinity,
second = -Infinity,
third = -Infinity
for (const value of arr) {
if (value > max) {
[second, max] = [max, value] // save previous max
} else if (value < max && value > second) {
second = value // new second biggest
third = second // new third biggest
} else if (value < second && value > third) {
third = value // new third biggest
}
}
return [second, third]
а нельзя в максимальном или минимальном элементе массива сделать так?
const arr = [3, 2, 4, 5, 1]
const min = arr.sort()[0]
const max = arr.sort()[arr.length - 1]
да кнчн
Если в массиве будет 100, то max у Вас будет равна 5, что будет ошибкой.
каким каким оператором? тренарным? 😂 может тернарным?
тернарным, а не тренарным
Вопросы на уровне стажёра, на Джуна уж посложнее задачи спрашивают, как минимум, средний уровень с leetcode
Собеседование довольно стрессовый процесс. И даже, порой простые вопросы и задачи вызывают трудности. Даже на 1 задачу среднего уровня нужно выделять все собеседование, а ведь спросить хочется не только 1 задачу.
Сделать плоский массив, нельзя использовать flat
А также нельзя использовать рекурсию
А так же, нельзя использовать массив 😆
@@wisejs будет тогда сложно
Сомнительно чтобы давали настолько простые задачи на собесе
Если просят крутить деревья, лучше сразу уйти. Потом такие особи крутят тебе мозги
@@plart2006 по подробней можно?
@@McNeelone я думаю он имел ввиду работу с DOM элементами , если сразу просят работать с ними ,то лучше сразу покинуть собеседование...
Я так его понял
@@KrivovNikolay бинарные деревья поиска
@@plart2006 ну такой себе совет. Если ты умеешь крутить деревья, то почему бы и не покрутить? Если не умеешь, то да, можно сразу уходить: у тебя и у компании разные взгляды на то, что ты должен знать и уметь на той позиции, куда тебя собеседуют. И консенсус вряд-ли получится.
ну middle вряд ли
Почему этот парень не моргает а я сразу не понял че не так🤔
Почему ты таким устаревшим циклом пользуешься? И ещё вводишь в заблуждение новичков! А также тут многие пишут что таких задач нет на собесах! Зря потерянное время …
Такой легкотни на собеседовании быть просто не может. Это даже не уровень джуна. Да, задачи тоже на массивы могут быть, но они будут куда сложнее и не такими очевидными, да еще и с особыми требованиями, типа сделать то-то, не используя что-то (например, какие-то стандартные методы) или не используя дополнительную память, либо показать алгоритм с заданной сложностью. В общем, такие задачи могут быть лишь на собеседовании в какой-то сказочной компании. А таковых давно не существует.
Чаще задвигают всякую теоретическую хрень типа прототипов и принципов ооп. Как говорится, особый js для собесов, который в реальной работе никогда не используется
Принципы ООП не связаны с js и их у любого программиста могут спросить
Искать максимум в массиве через сортировку - это дичь. Хуже неё только последний способ Math.max(...arr), приводящий к переполнению стека на длинном массиве. Автор, не учи джунов всякому плохому )
а как правильно? я делал через reduce
@@carry-on-chaos4032 через reduce вполне норм. Ну или обычным циклом.
junior еще бы поверил для первой легкой задачки на собеседовании, но точно не мидл, это уровень интерна, не более
На собесе такое не просят решать. Это детсадовские задачи.
😵😵😵 не лишайте меня мотивации.
array.reduce((acc:number, next:number) - Почему у меня аккумуляторы не работают? Все примеры из видео с аккумулятормаи у меня не пашут.
Хотя reduce вот так работает:
const array = [1, 2, 2, 4, 5, 6, 6, 100];
let sum = array.reduce(function (currentSum, currentNumber) {
return currentSum + currentNumber
} , 0)
const A = [1, 2, 3, 4, 5, 2, 1];
console.log([...new Set(A.filter((a) => A.length - A.filter((f) => f != a).length > 1))]);
function duplicate(nums) {
return new Set(nums.filter(n => nums.indexOf(n) !== nums.lastIndexOf(n)))
}
Крутое решение 👍
Только Big O у решения большая
Зашёл увидел старющий как мир цикл и сразу закрыл видео 🤮