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

  Рет қаралды 16,689

Vasilii Muravev

Vasilii Muravev

Жыл бұрын

В этом видео мы рассмотрим 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

Пікірлер: 99
@eldarkurmanaliev7130
@eldarkurmanaliev7130 10 ай бұрын
вместо создания объекта и потом вызова метода forEach, можно сразу использовать reduce, где начальное значение будет объект
@user-lm9ee1gn5p
@user-lm9ee1gn5p Жыл бұрын
Спасибо за подобный контент, очень полезно 👍
@stackdev
@stackdev Жыл бұрын
Спасибо за поддержку!
@user-cu2ng7gf4k
@user-cu2ng7gf4k Жыл бұрын
Спасибо за задачи!
@andrewdefould1453
@andrewdefould1453 10 ай бұрын
Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив
@user-yq2mj6mq3e
@user-yq2mj6mq3e 6 ай бұрын
Нет. Тебе запросто скажут на собеседовании реши руками.
@SerzhNesteruk
@SerzhNesteruk 4 ай бұрын
Третья тоже одной строкой решается: Object.groupBy(list, ({ age }) => age) Та и пятую можно проще решить: friends.flatMap(({ pizzas }) => pizzas)
@TMANandMAISON991
@TMANandMAISON991 Ай бұрын
@@user-yq2mj6mq3e да и нахер их послать сразу можно)
@user-zw6bd5wo6t
@user-zw6bd5wo6t 3 ай бұрын
третья задача попалась на реальном собеседовании
@Sergei546
@Sergei546 4 ай бұрын
спасиб, топчик
@eg0ist_665
@eg0ist_665 Жыл бұрын
function uniqueItem(arr){ return Array.from(new Set(arr)) } решение для уникального значения в одну строчку
@8020Coding
@8020Coding Жыл бұрын
обычно на собесе тебя попросят решить данную задачу не используя new Set()
@d1m.a77
@d1m.a77 11 ай бұрын
​@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.
@user-yq2mj6mq3e
@user-yq2mj6mq3e 6 ай бұрын
Нет
@zergzerg4844
@zergzerg4844 6 ай бұрын
Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?
@TMANandMAISON991
@TMANandMAISON991 Ай бұрын
можно сделать луп по всем возрастам и создать ключи для каждого возраста, при этом значением можно задать null или пустой массив, как удобнее
@user-cu2ng7gf4k
@user-cu2ng7gf4k Жыл бұрын
Добрый день! Что вернет эта функция? function getObject(arr) { return arr.reduce((a, c) => a[c] ? a[c]++ : a[c] = 1, {}) }
@evgen1584
@evgen1584 6 ай бұрын
1, она работает неправильно, нужно писать через return a
@whiteguards43
@whiteguards43 8 ай бұрын
Смысл в той задаче, где нужно найти nums, target ?Если решаешь ее через двойной цикл, который равен o(n2)?
@alenache1
@alenache1 Жыл бұрын
2-ая задача: Array.from(new Set(array))
@nhrafun
@nhrafun Жыл бұрын
Пффф [...new Set(myFruits)] Спред? Не, не слышал
@alenache1
@alenache1 Жыл бұрын
@@nhrafun под капотом там одно и то же
@GonzaVladimir
@GonzaVladimir Жыл бұрын
@@nhrafun я не проверял, но вроде как этот код выведе не только одно уникальное, а все которые встречаются. тоесть [1,1,2,2,3,4,5]. выведет 1 2 3 4 5. проверьте, не хочу сам
@nhrafun
@nhrafun Жыл бұрын
@@GonzaVladimir изучите работу Set() и проверка не будет иметь смысла
@GonzaVladimir
@GonzaVladimir Жыл бұрын
@@nhrafun ты хочешь сказать, что код [...new Set(myFruits)] покажет верно? тогда изучи сам иди
@alenache1
@alenache1 Жыл бұрын
6-ая [...myStr].reduce((prev,next)=>next+prev)
@user-nl9nh4yj9u
@user-nl9nh4yj9u 3 ай бұрын
str.split("").reverse().join("")
@znakjj
@znakjj 11 ай бұрын
Какая цветовая тема используется на видео?
@stackdev
@stackdev 11 ай бұрын
Dracula
@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 Жыл бұрын
@@romanbrandt7986 то что ты поставил после места работы скобочки намекает на то что ты врешь) доказать сможешЬ?
@stepankormilin7147
@stepankormilin7147 2 ай бұрын
j < nums.length - 1
@oppositus
@oppositus 7 ай бұрын
3-я задача аналогична 1-й. Нужно использовать Map, где ключ - возраст, значение - массив имён
@SerzhNesteruk
@SerzhNesteruk 4 ай бұрын
По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object: list => Object.groupBy(list, ({ age }) => age) Да, аналогичный метод есть и у Map 🤓
@UCmdrhccjVM95UidL5idZw2Q
@UCmdrhccjVM95UidL5idZw2Q Жыл бұрын
👍
@user-nl9nh4yj9u
@user-nl9nh4yj9u 3 ай бұрын
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 7 ай бұрын
4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).
@SerzhNesteruk
@SerzhNesteruk 5 ай бұрын
Вполне возможен и вариант решения со сложностью алгоритма по времени 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 []; };
@GazGaz-xq4fd
@GazGaz-xq4fd 3 ай бұрын
в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение
@fortilda1
@fortilda1 5 ай бұрын
2 задача ``` const newArr = [...new Set(fruits)] ```
@benchik100
@benchik100 3 ай бұрын
i've done
@vvllaaddiikk
@vvllaaddiikk Жыл бұрын
думаю reduce можно в одну строку делать
@UserNoNAME669
@UserNoNAME669 11 ай бұрын
task two const uniqueItems = (list) => { const res = list.filter((item, index) => list.indexOf(item) === index); return res; }; console.log(uniqueItems(fruits));
@SerzhNesteruk
@SerzhNesteruk 5 ай бұрын
Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔
@user-mx1wd7bm7t
@user-mx1wd7bm7t Жыл бұрын
4я задача, если поставить больше цифр, или цифры которые в сумме тоже дадут "10", 5 5, 3 7, 4 6 ..... данная функция вернет только Первую пару.
@azatfarmanyan150
@azatfarmanyan150 Жыл бұрын
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 5 ай бұрын
Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так: 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 []; };
@oppositus
@oppositus 7 ай бұрын
6-я задача ок. Можно сделать быстрее через 2 индекса, но ладно, зачот.
@oppositus
@oppositus 7 ай бұрын
2-я задача тоже решена грязно и не оптимально. Решается в 1 строчку: return Array.from(new Set(list))
@demimurych1
@demimurych1 Жыл бұрын
Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец" Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом: _По одной задаче в дочернем комментарии_
@demimurych1
@demimurych1 Жыл бұрын
*Задача 1: Сколько раз каждый элемент встречается в массиве:* Эта задача на предмет того, насколько соискатель владеет выражениями в JS ( (theTargetList) => ( theTargetList.reduce( (theRes, theCur) => ( (++theRes[theCur] || (theRes[theCur]=1), theRes) ) , {} ) ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
@demimurych1
@demimurych1 Жыл бұрын
*Задача 2: Создать массив который содержит только уникальные значения* Это задача на знание того чем являются структуры map или set ( (theTargetList) => ( [...new Set(theTargetList)] ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
@demimurych1
@demimurych1 Жыл бұрын
*Задача 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 Жыл бұрын
*Задача 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 Жыл бұрын
*Задача 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'] } ]);
@oppositus
@oppositus 7 ай бұрын
Итого - нормально решена 1 задача из 6. С одной стороны - стыд и позор. С другой стороны - я спокоен за свое будущее - пока учат так, как на видео, я даже в 80 лет в глубоком маразме буду получать больше подавляющего числа выпускников таких курсов, бггг.
@alenache1
@alenache1 Жыл бұрын
в 4 задаче в java вылетела бы IndexOutOfBoundsException, элемент по j выходит за диапазон
@motherhackerok
@motherhackerok 9 ай бұрын
Везде пихает forEach -_- , самый нерекомендуемый способ
@user-nk9nj6cz5l
@user-nk9nj6cz5l 2 ай бұрын
вторую задачу можно было написать в 2 строки
@oppositus
@oppositus 7 ай бұрын
5-я задача. Как вы все любите reduce не по делу! Решается через Set. Заодно и быстрее будет
@SerzhNesteruk
@SerzhNesteruk 5 ай бұрын
Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует. Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap: const extractFavoritePizzas = friends => ( friends.flatMap(item => item.pizzas ?? []) );
@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 []; }
@GonzaVladimir
@GonzaVladimir Жыл бұрын
сумма например 8, или -4.
@GonzaVladimir
@GonzaVladimir Жыл бұрын
@@MrBeasD... что причём тут это? это что тут причём не понял вопроса. Я ошибку то вижу у него в коде. и сразу увидел на каких числах будет баг. вот и написал автору, пусть попробует сумму 8 сделать . Ты странный дядя. формулируй мысли свои лучше
@GonzaVladimir
@GonzaVladimir Жыл бұрын
@@MrBeasD... я тебе скажу, что я только что кое что поправил и он работает. но ты должен сам понять
@SerzhNesteruk
@SerzhNesteruk 5 ай бұрын
Для массива [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]);
@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
@fakejoji1
@fakejoji1 Жыл бұрын
@@hrayrashchyan5925 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']; const uniqueFruits = [...new Set(fruits)]; console.log(uniqueFruits)
@adamhanck
@adamhanck 4 ай бұрын
Для первой задачки можно было ещё проще написать, как вариант) for (let el of fruits){ if (objFruit[`${el}`]){ objFruit[`${el}`] += 1; } else{ objFruit[`${el}`] = 1; } }
@SerzhNesteruk
@SerzhNesteruk 4 ай бұрын
Спасибо, что поделились решением! Есть некоторые нюансы. 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) );
@rukioruk6949
@rukioruk6949 9 ай бұрын
Получилось решить 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 5 ай бұрын
Спасибо за то, что делитесь! Решение выполнено методом 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 5 ай бұрын
@@SerzhNesteruk Согласен, что по сложности не проходит и можно с одной итерацией. :)
@oppositus
@oppositus 7 ай бұрын
Комментарии по ходу просмотра: 1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.
@SerzhNesteruk
@SerzhNesteruk 5 ай бұрын
Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно. Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.
@xdayx53
@xdayx53 4 ай бұрын
умники в комментах собрались)))))))))))))
@webdeveloper5770
@webdeveloper5770 19 күн бұрын
Вот работа из чего наша состоит? Взять данные с сервера и отрисовать их в шаблоне. Или взять данные от пользовать и отправить на сервер. А на собеседованиях реально эта чушь.
ТОП 10 вопросов на собеседовании ReactJS
29:52
Веб-разработка - DevMagazine
Рет қаралды 46 М.
Викторина от МАМЫ 🆘 | WICSUR #shorts
00:58
Бискас
Рет қаралды 5 МЛН
Doing This Instead Of Studying.. 😳
00:12
Jojo Sim
Рет қаралды 20 МЛН
Llegó al techo 😱
00:37
Juan De Dios Pantoja
Рет қаралды 60 МЛН
JavaScript 5 типовых задач на собеседовании, решаем их!
10:41
WebDev с нуля. Канал Алекса Лущенко
Рет қаралды 124 М.