Тёмный

JavaScript - 6 задач на собеседовании + решение 

Vasilii Muravev
Подписаться 21 тыс.
Просмотров 16 тыс.
50% 1

В этом видео мы рассмотрим 6 задач, которые встречаются на собеседованиях JavaScript и решим их.
Рабочие файлы: t.me/stackdevru/72
Мои Курсы:
JavaScript для начинающих: js001.ru
React для начинающих: react001.ru
​Все мои курсы (+ исходные файлы): stackdev.ru
Подписывайся на соц сети:
Telegram: t.me/stackdevru
VK: vasilymur
Instagram: / vm_online
Мой блог о веб-разработке: stackdev.blog

Опубликовано:

 

17 июн 2023

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 98   
@eldarkurmanaliev7130
@eldarkurmanaliev7130 10 месяцев назад
вместо создания объекта и потом вызова метода forEach, можно сразу использовать reduce, где начальное значение будет объект
@user-cu2ng7gf4k
@user-cu2ng7gf4k Год назад
Спасибо за задачи!
@user-lm9ee1gn5p
@user-lm9ee1gn5p Год назад
Спасибо за подобный контент, очень полезно 👍
@stackdev
@stackdev Год назад
Спасибо за поддержку!
@andrewdefould1453
@andrewdefould1453 9 месяцев назад
Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив
@user-yq2mj6mq3e
@user-yq2mj6mq3e 5 месяцев назад
Нет. Тебе запросто скажут на собеседовании реши руками.
@SerzhNesteruk
@SerzhNesteruk 3 месяца назад
Третья тоже одной строкой решается: Object.groupBy(list, ({ age }) => age) Та и пятую можно проще решить: friends.flatMap(({ pizzas }) => pizzas)
@TMANandMAISON991
@TMANandMAISON991 23 дня назад
@@user-yq2mj6mq3e да и нахер их послать сразу можно)
@user-zw6bd5wo6t
@user-zw6bd5wo6t 2 месяца назад
третья задача попалась на реальном собеседовании
@Sergei546
@Sergei546 3 месяца назад
спасиб, топчик
@eg0ist_665
@eg0ist_665 Год назад
function uniqueItem(arr){ return Array.from(new Set(arr)) } решение для уникального значения в одну строчку
@8020Coding
@8020Coding 11 месяцев назад
обычно на собесе тебя попросят решить данную задачу не используя new Set()
@d1m.a77
@d1m.a77 10 месяцев назад
​@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.
@user-yq2mj6mq3e
@user-yq2mj6mq3e 5 месяцев назад
Нет
@user-nl9nh4yj9u
@user-nl9nh4yj9u 2 месяца назад
4 задача, решение автора - квадратичная сложность (On^2) - тк двойной проход Почти все подобные задачи можно решить в один проход за On ,смотря в сторону использования мапы (обьект вспомогательный) const numbers = [3, 5, -4, 8, 11, 1, -1, 6]; const sum = 10; const map = {}; const fn = (numbers, sum) => { let result; for (let index = 0; index < numbers.length; index++) { const number = numbers[index]; if (map[sum - number]) { result = [sum - number, number]; index = numbers.length - 1; } if (!map[number]) { map[number] = sum - number; } result = []; } return result; }; console.log(fn(numbers, sum));
@oppositus
@oppositus 6 месяцев назад
3-я задача аналогична 1-й. Нужно использовать Map, где ключ - возраст, значение - массив имён
@SerzhNesteruk
@SerzhNesteruk 3 месяца назад
По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object: list => Object.groupBy(list, ({ age }) => age) Да, аналогичный метод есть и у Map 🤓
@alenache1
@alenache1 Год назад
6-ая [...myStr].reduce((prev,next)=>next+prev)
@user-nl9nh4yj9u
@user-nl9nh4yj9u 2 месяца назад
str.split("").reverse().join("")
@stepankormilin7147
@stepankormilin7147 Месяц назад
j < nums.length - 1
@alenache1
@alenache1 Год назад
2-ая задача: Array.from(new Set(array))
@nhrafun
@nhrafun Год назад
Пффф [...new Set(myFruits)] Спред? Не, не слышал
@alenache1
@alenache1 Год назад
@@nhrafun под капотом там одно и то же
@user-oz6xm9zp9d
@user-oz6xm9zp9d Год назад
@@nhrafun я не проверял, но вроде как этот код выведе не только одно уникальное, а все которые встречаются. тоесть [1,1,2,2,3,4,5]. выведет 1 2 3 4 5. проверьте, не хочу сам
@nhrafun
@nhrafun Год назад
@@user-oz6xm9zp9d изучите работу Set() и проверка не будет иметь смысла
@user-oz6xm9zp9d
@user-oz6xm9zp9d Год назад
@@nhrafun ты хочешь сказать, что код [...new Set(myFruits)] покажет верно? тогда изучи сам иди
@oppositus
@oppositus 6 месяцев назад
4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Вполне возможен и вариант решения со сложностью алгоритма по времени O(n). Например, вот такой: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
@zergzerg4844
@zergzerg4844 5 месяцев назад
Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?
@TMANandMAISON991
@TMANandMAISON991 23 дня назад
можно сделать луп по всем возрастам и создать ключи для каждого возраста, при этом значением можно задать null или пустой массив, как удобнее
@user-cu2ng7gf4k
@user-cu2ng7gf4k Год назад
Добрый день! Что вернет эта функция? function getObject(arr) { return arr.reduce((a, c) => a[c] ? a[c]++ : a[c] = 1, {}) }
@evgen1584
@evgen1584 5 месяцев назад
1, она работает неправильно, нужно писать через return a
@alenache1
@alenache1 Год назад
очень расточительно решаешь задачи)) на 5-ой задаче на каждой итерации создаешь новый массив, это дорого и долго. Можно было так: let arr=[]; for(item in friends){arr.push(item.pizzas)}; arr=arr.flat(2)
@alenache1
@alenache1 Год назад
@@romanbrandt7986 решения, которые требуют значительно больше ресурсов, чем нужно - плохие. На собесе будут смотреть - понимаешь ты что и как ты делаешь или нет. Можно, конечно, гвозди микроскопом забивать, но это тебя будет характеризовать как проfнепригодного специалиста.
@alenache1
@alenache1 Год назад
@@romanbrandt7986 все, иди кури
@alenache1
@alenache1 Год назад
@@romanbrandt7986 когда И ЕСЛИ ты вдруг начнешь работать разработчиком, до тебя рано или поздно дойдет, что все задачи надо решать гигиенично и архитектурно в плане кода и оптимально в плане задействования ресурсов, это на автомате у тебя будет работать. Если не будет, ты выбрал не ту профессию, у тебя нет инженерного мышления. Так что иди учись) пока твои вопросы говорят, что ты этого не понимаешь)
@user-fz9vb3if1k
@user-fz9vb3if1k Год назад
@@romanbrandt7986 вот ты его расчехлил😆😆😆, надо было оставит, пусть повыделывается))
@user-jl8kc2xi5g
@user-jl8kc2xi5g 11 месяцев назад
@@romanbrandt7986 то что ты поставил после места работы скобочки намекает на то что ты врешь) доказать сможешЬ?
@whiteguards43
@whiteguards43 7 месяцев назад
Смысл в той задаче, где нужно найти nums, target ?Если решаешь ее через двойной цикл, который равен o(n2)?
@UserNoNAME669
@UserNoNAME669 10 месяцев назад
task two const uniqueItems = (list) => { const res = list.filter((item, index) => list.indexOf(item) === index); return res; }; console.log(uniqueItems(fruits));
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔
@fortilda1
@fortilda1 4 месяца назад
2 задача ``` const newArr = [...new Set(fruits)] ```
@znakjj
@znakjj 10 месяцев назад
Какая цветовая тема используется на видео?
@stackdev
@stackdev 10 месяцев назад
Dracula
@vvllaaddiikk
@vvllaaddiikk Год назад
думаю reduce можно в одну строку делать
@UCmdrhccjVM95UidL5idZw2Q
@UCmdrhccjVM95UidL5idZw2Q Год назад
👍
@demimurych1
@demimurych1 11 месяцев назад
Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец" Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом: _По одной задаче в дочернем комментарии_
@demimurych1
@demimurych1 11 месяцев назад
*Задача 1: Сколько раз каждый элемент встречается в массиве:* Эта задача на предмет того, насколько соискатель владеет выражениями в JS ( (theTargetList) => ( theTargetList.reduce( (theRes, theCur) => ( (++theRes[theCur] || (theRes[theCur]=1), theRes) ) , {} ) ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
@demimurych1
@demimurych1 11 месяцев назад
*Задача 2: Создать массив который содержит только уникальные значения* Это задача на знание того чем являются структуры map или set ( (theTargetList) => ( [...new Set(theTargetList)] ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
@demimurych1
@demimurych1 11 месяцев назад
*Задача 3: Создать функцию, которая сгруппирует студентов по возрасту* Это задача подобно первой проверяет понимание выражений, с упором в Object ( (theStudentList) => ( theStudentList.reduce( (theRes, theCur) => ( (theRes[theCur.age] ||= []).push(theCur) ,theRes ) ,{} ) ) ) ( [ { name: 'alex', age: 20 }, { name: 'mike', age: 24 }, { name: 'masha', age: 20 }, { name: 'stas', age: 18 }, ]);
@demimurych1
@demimurych1 11 месяцев назад
*Задача 4: Написать функцию, которая принимает два аргумент* массив из уникальных целых чисел и сумму в виде целого числа. Если сумма двух любых чисел массива из аргумента равна числу, которое приходит вторым аргументом, функция должна вернуть новый массив из этих двух чисел в любом порядке. Если решения нет, вернуть пустой массив. Это задача на то, насколько соискатель может мыслить не в лоб. Способен ли он импровизировать. Оригинальных решений у нее достаточно много. Обычно от соискателя ждут уточняющий вопрос, который помогает ему выбрать наиболее оптимальное. Например такое: ( (theListOfNumbers, theTargetSum) => ( theListOfNumbers.reduce( (theRes, theCur, theIndex, theArr) => { var theTarget; ( theArr.indexOf((theTarget=theTargetSum-theCur), ++theIndex) !== -1) && (theRes.push([theCur, theTarget])); return theRes; } , [] ) ) )([3, 5, -4, 8, 11, 1, -1, 6,4], 10);
@demimurych1
@demimurych1 11 месяцев назад
*Задача 5: Получить единый массив из любимых пицц каждого друга* Это задача на знание того что такое flat ( (thePizzaList) => ( thePizzaList.reduce( (theRes, theCur) => (theRes.push(theCur.pizzas),theRes) , [] ).flat() ) )([ { name: 'alex', pizzas: ['cheese', 'pepperoni'] }, { name: 'mike', pizzas: ['salami', 'margarita'] }, { name: 'stas', pizzas: ['meat'] }, { name: 'anna', pizzas: ['fish'] } ]);
@user-mx1wd7bm7t
@user-mx1wd7bm7t Год назад
4я задача, если поставить больше цифр, или цифры которые в сумме тоже дадут "10", 5 5, 3 7, 4 6 ..... данная функция вернет только Первую пару.
@azatfarmanyan150
@azatfarmanyan150 11 месяцев назад
const arr = [-1, 3, 5, 4, -4, 8, 11, 1, -1, 6]; const sum = 10; function getSum(arr, sum) { const res = []; for (let i = 0; i < arr.length; i++) { const eli = arr[i]; for (let j = i + 1; j < arr.length; j++) { const elj = arr[j]; if (eli + elj === sum) { res.push([eli, elj]); } } } return res; } console.log(getSum(arr, sum));
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
@GazGaz-xq4fd
@GazGaz-xq4fd 2 месяца назад
в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение
@benchik100
@benchik100 2 месяца назад
i've done
@hrayrashchyan5925
@hrayrashchyan5925 Год назад
на всякий если решение повторяться ,я не смотрел заранее const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']; const countFruit = (list) => { let obj = {}; list.map((v,i)=>{ if(!obj[v]){ obj[v] = 1 }else{ (obj[v])++ } }) console.log(obj) return obj } countFruit(fruits) если отличается от вашего кода, сделаете код ревью и оставляете отзывы
@hrayrashchyan5925
@hrayrashchyan5925 Год назад
super, almost the same solution
@hrayrashchyan5925
@hrayrashchyan5925 Год назад
task 2 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']; const uniqueSet = new Set(fruits) const arr = Array.from(uniqueSet) console.log(arr)
@hrayrashchyan5925
@hrayrashchyan5925 Год назад
task3 const students = [ {name: 'alex',age:20}, {name: 'mike',age:24}, {name: 'masha',age:20}, {name: 'stas',age:18}, ]; function foo(list) { resObj = {}; list.map((obj,index) => { if(!resObj[obj.age]){ resObj[obj.age] = [obj] } else { resObj[obj.age].push(obj) } }) console.log(resObj) } foo(students)
@hrayrashchyan5925
@hrayrashchyan5925 Год назад
same solution again
@joji5955
@joji5955 Год назад
@@hrayrashchyan5925 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']; const uniqueFruits = [...new Set(fruits)]; console.log(uniqueFruits)
@oppositus
@oppositus 6 месяцев назад
5-я задача. Как вы все любите reduce не по делу! Решается через Set. Заодно и быстрее будет
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует. Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap: const extractFavoritePizzas = friends => ( friends.flatMap(item => item.pizzas ?? []) );
@alenache1
@alenache1 Год назад
в 4 задаче в java вылетела бы IndexOutOfBoundsException, элемент по j выходит за диапазон
@oppositus
@oppositus 6 месяцев назад
6-я задача ок. Можно сделать быстрее через 2 индекса, но ладно, зачот.
@oppositus
@oppositus 6 месяцев назад
Итого - нормально решена 1 задача из 6. С одной стороны - стыд и позор. С другой стороны - я спокоен за свое будущее - пока учат так, как на видео, я даже в 80 лет в глубоком маразме буду получать больше подавляющего числа выпускников таких курсов, бггг.
@ediltalantbekov
@ediltalantbekov Год назад
4 решение ну такое себе (Вложенный цикл). В зависимости от размера массива, это решение станет очень долгим и затратным. есть лучше решение с object опять же) const findPairs = (nums, sum) => { const lib = {}; for (let i = 0; i < nums.length; i++) { const diff = sum - nums[i]; if (lib[diff]) return [diff, nums[i]]; lib[nums[i]] = i; } return []; }
@user-oz6xm9zp9d
@user-oz6xm9zp9d Год назад
сумма например 8, или -4.
@user-oz6xm9zp9d
@user-oz6xm9zp9d Год назад
@@MrBeasD... что причём тут это? это что тут причём не понял вопроса. Я ошибку то вижу у него в коде. и сразу увидел на каких числах будет баг. вот и написал автору, пусть попробует сумму 8 сделать . Ты странный дядя. формулируй мысли свои лучше
@user-oz6xm9zp9d
@user-oz6xm9zp9d Год назад
@@MrBeasD... я тебе скажу, что я только что кое что поправил и он работает. но ты должен сам понять
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Для массива [6, 4] и значения суммы 10 будет возвращён пустой массив. Во всех случаях, когда одно из слагаемых находится на нулевом индексе, функция будет работать некорректно, поэтому lib[nums[i]] = i; лучше заменить на lib[nums[i]] = true; 🤔 Ну, и как по мне, вместо объекта лучше использовать коллекцию Set (const lib = new Set();), тогда 2-я и 3-я строки в теле цикла будут иметь следующий вид: if ( lib.has(diff) ) return [diff, nums[i]]; lib.add(nums[i]);
@rukioruk6949
@rukioruk6949 8 месяцев назад
Получилось решить 4-ю задачу таким образом: const findPairs = (numbers: number[], sum: number): number[] => { let result: number[] = [] numbers.forEach((itemI: number, i: number) => { numbers.forEach((itemJ: number, j: number) => { if (i !== j && itemI + itemJ === sum) { result = [itemI, itemJ]; } }) }) return result; }
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Спасибо за то, что делитесь! Решение выполнено методом brute force с полным перебором всех возможных вариантов. В данном решении нет досрочного завершения цикла при нахождении первой подходящей пары слагаемых. Та и сложность алгоритма по времени здесь равна O(n²). В варианте на видео она в 2 раза меньше (было учтено то, что порядок сложения не влияет на сумму [a + b эквивалентно b + a], путём задания стартового значения счётчика во внутреннем цикле), хотя и там она квадратичная. Но всё же есть возможность решить задачу с линейной сложностью O(n) и с досрочным завершением цикла. В JS-коде это будет выглядеть примерно так: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
@rukioruk6949
@rukioruk6949 4 месяца назад
@@SerzhNesteruk Согласен, что по сложности не проходит и можно с одной итерацией. :)
@oppositus
@oppositus 6 месяцев назад
2-я задача тоже решена грязно и не оптимально. Решается в 1 строчку: return Array.from(new Set(list))
@adamhanck
@adamhanck 3 месяца назад
Для первой задачки можно было ещё проще написать, как вариант) for (let el of fruits){ if (objFruit[`${el}`]){ objFruit[`${el}`] += 1; } else{ objFruit[`${el}`] = 1; } }
@SerzhNesteruk
@SerzhNesteruk 3 месяца назад
Спасибо, что поделились решением! Есть некоторые нюансы. 1) Пропущено важное объявление: const objFruit = Object.create(null); Инициализировать objFruit стоит именно так, а не через литерал пустого объекта, во избежание коллизий с именами унаследованных свойств от Object.prototype. 2) Можно воспользоваться преимуществом динамической типизации и вместо objFruit[`${el}`] просто писать эквивалентное objFruit[el] 3) Конструкцию if...else можно заменить одной строкой: objFruit[el] = (objFruit[el] || 0) + 1; Ну, а вообще. Здесь как-то уж очень напрашивается reduce: const objFruit = fruits.reduce((map, item) => { map[item] = map([item] || 0) + 1; return map; }, Object.create(null) );
@user-nk9nj6cz5l
@user-nk9nj6cz5l Месяц назад
вторую задачу можно было написать в 2 строки
@motherhackerok
@motherhackerok 8 месяцев назад
Везде пихает forEach -_- , самый нерекомендуемый способ
@oppositus
@oppositus 6 месяцев назад
Комментарии по ходу просмотра: 1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.
@SerzhNesteruk
@SerzhNesteruk 4 месяца назад
Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно. Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.
@xdayx53
@xdayx53 3 месяца назад
умники в комментах собрались)))))))))))))
Далее
Reduce, isArray - методы массивов
18:33