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

Поделиться
HTML-код
  • Опубликовано: 21 ноя 2024

Комментарии • 104

  • @andrewdefould1453
    @andrewdefould1453 Год назад +17

    Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив

    • @Илья-к6е5и
      @Илья-к6е5и 9 месяцев назад +5

      Нет.
      Тебе запросто скажут на собеседовании реши руками.

    • @SerzhNesteruk
      @SerzhNesteruk 8 месяцев назад +2

      Третья тоже одной строкой решается:
      Object.groupBy(list, ({ age }) => age)
      Та и пятую можно проще решить:
      friends.flatMap(({ pizzas }) => pizzas)

    • @TMANandMAISON991
      @TMANandMAISON991 5 месяцев назад

      @@Илья-к6е5и да и нахер их послать сразу можно)

    • @efimovmaksim
      @efimovmaksim 3 месяца назад

      в пятой еще и уникальные было бы не плохо иметь, а не все подряд

  • @eldarkurmanaliev7130
    @eldarkurmanaliev7130 Год назад +13

    вместо создания объекта и потом вызова метода forEach, можно сразу использовать reduce, где начальное значение будет объект

  • @alenache1
    @alenache1 Год назад +8

    2-ая задача: Array.from(new Set(array))

    • @nhrafun
      @nhrafun Год назад +1

      Пффф [...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)] покажет верно? тогда изучи сам иди

  • @ПавелРубан-е5м
    @ПавелРубан-е5м 6 месяцев назад +1

    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));

  • @eg0ist_665
    @eg0ist_665 Год назад +5

    function uniqueItem(arr){
    return Array.from(new Set(arr))
    } решение для уникального значения в одну строчку

    • @8020Coding
      @8020Coding Год назад

      обычно на собесе тебя попросят решить данную задачу не используя new Set()

    • @d1m.a77
      @d1m.a77 Год назад +1

      ​@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.

    • @Илья-к6е5и
      @Илья-к6е5и 9 месяцев назад

      Нет

  • @oppositus
    @oppositus 10 месяцев назад

    3-я задача аналогична 1-й. Нужно использовать Map, где ключ - возраст, значение - массив имён

    • @SerzhNesteruk
      @SerzhNesteruk 8 месяцев назад +1

      По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object:
      list => Object.groupBy(list, ({ age }) => age)
      Да, аналогичный метод есть и у Map 🤓

  • @СтаниславГорячев-г1ъ

    Спасибо за подобный контент, очень полезно 👍

    • @stackdev
      @stackdev  Год назад

      Спасибо за поддержку!

  • @oppositus
    @oppositus 10 месяцев назад

    4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).

    • @SerzhNesteruk
      @SerzhNesteruk 9 месяцев назад +2

      Вполне возможен и вариант решения со сложностью алгоритма по времени 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 [];
      };

  • @alenache1
    @alenache1 Год назад +4

    6-ая [...myStr].reduce((prev,next)=>next+prev)

  • @dsmorodiny
    @dsmorodiny 2 месяца назад

    Спасибо большое, брат!

  • @АрчибальтГугенов
    @АрчибальтГугенов Год назад +3

    Спасибо за задачи!

  • @СережаИгнатовский-ь3б
    @СережаИгнатовский-ь3б 7 месяцев назад +4

    третья задача попалась на реальном собеседовании

  • @stepankormilin7147
    @stepankormilin7147 5 месяцев назад

    j < nums.length - 1

  • @alenache1
    @alenache1 Год назад +8

    очень расточительно решаешь задачи)) на 5-ой задаче на каждой итерации создаешь новый массив, это дорого и долго. Можно было так: let arr=[]; for(item in friends){arr.push(item.pizzas)}; arr=arr.flat(2)

    • @alenache1
      @alenache1 Год назад +1

      @@romanbrandt7986 решения, которые требуют значительно больше ресурсов, чем нужно - плохие. На собесе будут смотреть - понимаешь ты что и как ты делаешь или нет. Можно, конечно, гвозди микроскопом забивать, но это тебя будет характеризовать как проfнепригодного специалиста.

    • @alenache1
      @alenache1 Год назад

      @@romanbrandt7986 все, иди кури

    • @alenache1
      @alenache1 Год назад

      @@romanbrandt7986 когда И ЕСЛИ ты вдруг начнешь работать разработчиком, до тебя рано или поздно дойдет, что все задачи надо решать гигиенично и архитектурно в плане кода и оптимально в плане задействования ресурсов, это на автомате у тебя будет работать. Если не будет, ты выбрал не ту профессию, у тебя нет инженерного мышления. Так что иди учись) пока твои вопросы говорят, что ты этого не понимаешь)

    • @user-fz9vb3if1k
      @user-fz9vb3if1k Год назад

      @@romanbrandt7986 вот ты его расчехлил😆😆😆, надо было оставит, пусть повыделывается))

    • @Эдди-д1ц
      @Эдди-д1ц Год назад

      @@romanbrandt7986 то что ты поставил после места работы скобочки намекает на то что ты врешь) доказать сможешЬ?

  • @fortilda1
    @fortilda1 9 месяцев назад +1

    2 задача ``` const newArr = [...new Set(fruits)] ```

  • @demimurych1
    @demimurych1 Год назад +3

    Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка
    То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец"
    Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом:
    _По одной задаче в дочернем комментарии_

    • @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 Год назад +1

      *Задача 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'] }
      ]);

  • @viacheslav-dev-pro
    @viacheslav-dev-pro Год назад

    task two
    const uniqueItems = (list) => {
    const res = list.filter((item, index) => list.indexOf(item) === index);
    return res;
    };
    console.log(uniqueItems(fruits));

    • @SerzhNesteruk
      @SerzhNesteruk 9 месяцев назад

      Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔

  • @АрчибальтГугенов
    @АрчибальтГугенов Год назад +2

    Добрый день! Что вернет эта функция?
    function getObject(arr) {
    return arr.reduce((a, c) => a[c] ? a[c]++ : a[c] = 1, {})
    }

    • @evgen1584
      @evgen1584 9 месяцев назад +1

      1, она работает неправильно, нужно писать через return a

  • @Sergei546
    @Sergei546 8 месяцев назад +1

    спасиб, топчик

  • @ДмитрийЧёрный-ж9г
    @ДмитрийЧёрный-ж9г Год назад +3

    4я задача, если поставить больше цифр, или цифры которые в сумме тоже дадут "10", 5 5, 3 7, 4 6 ..... данная функция вернет только Первую пару.

    • @azatfarmanyan150
      @azatfarmanyan150 Год назад +1

      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 9 месяцев назад

      Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так:
      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 [];
      };

  • @adamhanck
    @adamhanck 8 месяцев назад +1

    Для первой задачки можно было ещё проще написать, как вариант)
    for (let el of fruits){
    if (objFruit[`${el}`]){
    objFruit[`${el}`] += 1;
    }
    else{
    objFruit[`${el}`] = 1;
    }
    }

    • @SerzhNesteruk
      @SerzhNesteruk 8 месяцев назад +1

      Спасибо, что поделились решением!
      Есть некоторые нюансы.
      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) );

  • @whiteguards43
    @whiteguards43 Год назад

    Смысл в той задаче, где нужно найти nums, target ?Если решаешь ее через двойной цикл, который равен o(n2)?

  • @oppositus
    @oppositus 10 месяцев назад

    Итого - нормально решена 1 задача из 6.
    С одной стороны - стыд и позор. С другой стороны - я спокоен за свое будущее - пока учат так, как на видео, я даже в 80 лет в глубоком маразме буду получать больше подавляющего числа выпускников таких курсов, бггг.

  • @zergzerg4844
    @zergzerg4844 10 месяцев назад

    Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?

    • @TMANandMAISON991
      @TMANandMAISON991 5 месяцев назад

      можно сделать луп по всем возрастам и создать ключи для каждого возраста, при этом значением можно задать null или пустой массив, как удобнее

  • @znakjj
    @znakjj Год назад

    Какая цветовая тема используется на видео?

  • @hrayrashchyan5925
    @hrayrashchyan5925 Год назад +1

    на всякий если решение повторяться ,я не смотрел заранее
    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 Год назад +1

      super, almost the same solution

    • @hrayrashchyan5925
      @hrayrashchyan5925 Год назад +2

      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 Год назад +1

      @@hrayrashchyan5925 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
      const uniqueFruits = [...new Set(fruits)];
      console.log(uniqueFruits)

  • @oppositus
    @oppositus 10 месяцев назад

    5-я задача. Как вы все любите reduce не по делу! Решается через Set. Заодно и быстрее будет

    • @SerzhNesteruk
      @SerzhNesteruk 9 месяцев назад

      Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует.
      Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap:
      const extractFavoritePizzas = friends => (
      friends.flatMap(item => item.pizzas ?? [])
      );

  • @benchik100
    @benchik100 7 месяцев назад +1

    i've done

  • @vvllaaddiikk
    @vvllaaddiikk Год назад +1

    думаю reduce можно в одну строку делать

  • @BrainF1986
    @BrainF1986 Месяц назад

    Открыл видео. Увидел решение первой задачи. Закрыл видео.

  • @ediltalantbekov
    @ediltalantbekov Год назад +3

    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 9 месяцев назад +2

      Для массива [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]);

  • @iq240-1
    @iq240-1 Год назад +1

    👍

  • @oppositus
    @oppositus 10 месяцев назад

    6-я задача ок. Можно сделать быстрее через 2 индекса, но ладно, зачот.

  • @xdayx53
    @xdayx53 7 месяцев назад +1

    умники в комментах собрались)))))))))))))

  • @rukioruk6949
    @rukioruk6949 Год назад

    Получилось решить 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 9 месяцев назад +1

      Спасибо за то, что делитесь! Решение выполнено методом 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 9 месяцев назад +1

      @@SerzhNesteruk Согласен, что по сложности не проходит и можно с одной итерацией. :)

  • @oppositus
    @oppositus 10 месяцев назад +1

    Комментарии по ходу просмотра:
    1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.

    • @SerzhNesteruk
      @SerzhNesteruk 9 месяцев назад

      Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно.
      Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.

  • @oppositus
    @oppositus 10 месяцев назад +1

    2-я задача тоже решена грязно и не оптимально. Решается в 1 строчку:
    return Array.from(new Set(list))

  • @GazGaz-xq4fd
    @GazGaz-xq4fd 6 месяцев назад

    в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение

  • @alenache1
    @alenache1 Год назад +1

    в 4 задаче в java вылетела бы IndexOutOfBoundsException, элемент по j выходит за диапазон

  • @motherhackerok
    @motherhackerok Год назад +1

    Везде пихает forEach -_- , самый нерекомендуемый способ

  • @Ирилл-щ9р
    @Ирилл-щ9р 5 месяцев назад

    вторую задачу можно было написать в 2 строки

  • @webdeveloper5770
    @webdeveloper5770 4 месяца назад

    Вот работа из чего наша состоит? Взять данные с сервера и отрисовать их в шаблоне. Или взять данные от пользовать и отправить на сервер. А на собеседованиях реально эта чушь.